모든 아티클

Bcrypt: 비밀번호를 빠르게가 아니라 느리게 해시하는 이유

bcrypt의 72바이트 제한은 언어마다 다르게 작동합니다. 한글 음절(가, 나, 다 등 완성형 한글)은 UTF-8에서 글자당 3바이트를 차지하므로, 한국어 비밀번호의 실질적인 상한선은 72자가 아니라 약 24자입니다. 예를 들어 "매우안전한비밀번호입니다" 같은 24자 안팎의 한국어 문구는 이미 이 경계에 거의 도달한 것입니다.

속도가 비밀번호 보안에 해가 되는 이유

공격자가 비밀번호 해시 데이터베이스를 훔쳤다면, 무차별 대입으로 원래 비밀번호를 복구하려고 시도합니다. SHA-256 같은 빠른 함수라면 현대 하드웨어는 초당 수십억 개의 조합을 확인할 수 있습니다. bcrypt는 일부러 해시 한 번에 약 100밀리초가 걸리게 만들어, 무차별 대입을 몇 자릿수나 더 느리고 비싸게 만듭니다.

cost factor란 무엇인가

bcrypt의 "cost" 매개변수는 내부 라운드 수를 2의 거듭제곱(2^cost, 보통 10-12)으로 정합니다. 하나 올릴 때마다 해싱 시간이 대략 두 배가 되고, 공격자의 전체 무차별 대입 비용도 그만큼 두 배가 됩니다.

내장된 솔트

bcrypt는 각 비밀번호마다 고유한 무작위 솔트를 자동으로 생성해 결과에 직접 포함시킵니다 — 따로 저장할 필요가 없습니다. 동일한 비밀번호 두 개는 서로 다른 해시를 만들어내며, 흔한 비밀번호를 위해 미리 계산된 해시 표(레인보우 테이블)는 무용지물이 됩니다 — 각 해시를 개별적으로 공격해야 합니다.

왜 필요한가

  • 애플리케이션 데이터베이스에 사용자 비밀번호를 올바르게 저장하기.
  • SHA-256이나 MD5가 비밀번호 해싱에 나쁜 선택인 이유 이해하기.
  • bcrypt를 사용하는 인증 시스템을 테스트하거나 마이그레이션하기.

숨겨진 한계: 72바이트, 72글자가 아니다

bcrypt는 비밀번호의 처음 72바이트만 처리하며, 그보다 긴 부분은 경고 없이 그대로 버려집니다. 라틴 문자로만 된 비밀번호라면 72글자에 해당하지만, 한글처럼 글자당 3바이트를 쓰는 문자 체계에서는 실제로 담을 수 있는 글자 수가 그 3분의 1 수준입니다 — 한국어 사용자를 위한 회원가입 폼에서 최대 비밀번호 길이를 정할 때 알아둘 가치가 있습니다.

도구 사용해보기