비밀번호 해시 비용 계산기 쉽게 이해하기 — 개념과 원리
bcrypt나 PBKDF2 같은 비밀번호 해시는 일부러 느리게 만들어져, 비밀번호 데이터베이스가 유출되더라도 공격자가 1초에 시도할 수 있는 추측 횟수를 제한합니다. 이 계산기는 bcrypt 비용 인자에 따라 서버에서 해시 한 번에 걸리는 시간과 내부 반복 횟수를 계산하고, PBKDF2-HMAC-SHA256 반복 횟수가 OWASP 권장값 60만 회를 넘는지 확인합니다.
계산 방법
- bcrypt 소요 시간(ms) = 비용 10에서 측정한 시간 × 2^(비용 − 10)
- bcrypt 반복 횟수 = 2^비용
- PBKDF2 확인: 반복 횟수가 600,000 이상이면 "yes", 아니면 "no"
먼저 내 서버에서 비용 10으로 시험용 비밀번호를 몇 번 해시해 대표 시간을 재고, 그 값을 넣으면 계산기가 비례해서 늘려 줍니다. 비용 인자는 $2b$12$…처럼 해시 문자열 안에 저장되는 지수입니다.
원리
bcrypt는 비용이 큰 키 설정 단계에서 Blowfish 키 스케줄을 2^비용 번 반복하므로, 비용이 1 오를 때마다 나와 공격자 모두의 작업량이 두 배가 됩니다. 하드웨어가 빨라지면 알고리즘을 바꾸지 않고 비용만 올리면 됩니다. PBKDF2는 HMAC을 정한 횟수만큼 반복하므로 시간이 반복 횟수에 정비례합니다. 둘 다 CPU 중심이라, 메모리까지 많이 쓰게 하는 Argon2id가 GPU 공격에 더 강하며 OWASP도 가장 먼저 권합니다.
예제 풀이
- 입력값: 비용 12, 비용 10에서 60 ms, PBKDF2 반복 600,000회
- 배율: 2^(12 − 10) = 4
- bcrypt 시간: 60 × 4 = 240 ms
- 반복 횟수: 2^12 = 4,096
- PBKDF2: 600,000 ≥ 600,000이므로 yes
| bcrypt 비용 인자 | 이 비용에서 bcrypt 시간 (ms) |
|---|---|
| 3 | 0.46875 |
| 6 | 3.75 |
| 9 | 30 |
| 12 | 240 |
| 15 | 1,920 |
| 18 | 15,360 |
| 24 | 983,040 |
결과 해석
최대 접속 시간대에도 로그인 서버가 감당할 수 있는 가장 높은 비용을 고르는 것이 원칙입니다. 로그인 한 번에 해시 한 번이므로 240 ms라면 코어 하나가 처리할 수 있는 로그인 수가 그만큼 줄고, 공격자 역시 코어 하나로 1초에 약 4번밖에 시도하지 못합니다. OWASP는 Argon2id를 우선 권하고, bcrypt는 비용 10 이상, PBKDF2-HMAC-SHA256은 60만 회 이상을 권장합니다.
흔한 실수
- 내 서버에서 시간을 재지 않고 비용 값을 그대로 가져다 쓰는 경우
- bcrypt가 비밀번호의 앞 72바이트만 쓴다는 점을 잊는 경우
- 솔트를 넣은 SHA-256 같은 빠른 해시를 비밀번호 해시로 쓰는 경우
- 비용을 한 번 정한 뒤 올리지 않는 경우. 사용자가 로그인할 때 더 높은 비용으로 다시 해시하면 됩니다.
자주 묻는 질문
bcrypt 비용은 얼마로 해야 하나요?
OWASP 기준 최소 10이며, 내 하드웨어에서 응답 시간을 재어 감당할 수 있는 가장 높은 값을 고르시면 됩니다.
PBKDF2는 아직 써도 되나요?
네. FIPS 환경에서도 쓸 수 있고 지원이 넓지만, 메모리를 많이 쓰지 않으므로 반복 횟수를 충분히 높여야 합니다.
bcrypt에 솔트를 따로 넣어야 하나요?
bcrypt는 128비트 무작위 솔트를 자동으로 만들어 해시 문자열 안에 함께 저장합니다.
출처: OWASP Password Storage Cheat Sheet · N. Provos, D. Mazières, "A Future-Adaptable Password Scheme", USENIX Annual Technical Conference, 1999 · RFC 8018, PKCS #5: Password-Based Cryptography Specification Version 2.1 (PBKDF2)