설정
비밀번호 저장용 bcrypt 해시를 생성하고, 비밀번호가 기존 해시와 일치하는지 검증합니다. 생성 모드에서는 비용과 버전을 선택하고, 검증 모드에서는 해시와 확인할 비밀번호를 붙여 넣으세요. 결과에는 해시의 각 부분과 계산에 걸린 시간이 표시됩니다.

bcrypt 해시는 "복호화"할 수 없습니다. 비밀번호가 맞는지 확인하려면 검증 모드를 사용하세요. 모든 계산은 브라우저에서 이루어지며 비밀번호는 어떤 서버로도 전송되지 않습니다.

파라미터
4~15 사이

현재 버전입니다. OpenBSD, Node.js, Python, Go, Rust에서 생성합니다.

비용을 1 올릴 때마다 계산 시간이 두 배가 됩니다. OWASP는 최소 10을 권장하며, 서버가 약 250ms 안에 계산할 수 있는 가장 높은 값이 이상적입니다.

72바이트 중 0바이트

작동 방식

bcrypt는 비밀번호 저장을 위해 설계된 해시 함수입니다. 마이크로초 만에 계산되는 SHA-256이나 MD5와 달리 bcrypt는 의도적으로 느립니다. 그래서 데이터베이스를 훔친 공격자가 무차별 대입으로 비밀번호를 시도하는 데 수년이 걸립니다.

각 해시에는 검증에 필요한 모든 정보, 즉 알고리즘 버전, 비용, 128비트 무작위 솔트가 담겨 있습니다. 그래서 같은 비밀번호도 매번 다른 해시가 나오며 솔트를 따로 저장할 필요가 없습니다.

비용은 라운드 수의 밑이 2인 로그입니다. 비용 10이면 1024라운드, 비용 12이면 4096라운드를 계산합니다. 1을 올릴 때마다 계산 시간이 두 배가 되므로 알고리즘을 바꾸지 않고도 하드웨어 성능 향상에 대응할 수 있습니다.

예시

rasmuslerdorf$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1aPHP 매뉴얼에 있는 password_verify() 예제입니다. 검증 모드에서 이 비밀번호와 함께 붙여 넣으면 일치합니다.
abc$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i비용 6의 jBCrypt 테스트 벡터입니다. 비용 뒤의 처음 22자가 솔트이고 나머지 31자가 해시 값입니다.

활용 사례

  • 관리자 사용자의 초기 비밀번호 해시를 만들어 데이터베이스에 직접 삽입합니다.
  • 사용자가 로그인하지 못할 때 비밀번호가 저장된 해시와 일치하는지 확인합니다.
  • Laravel, Spring, Django, Node.js 애플리케이션의 픽스처, 시드, 자동화 테스트용 테스트 해시를 생성합니다.
  • 서버에 설정하기 전에 각 비용의 계산 시간을 측정해 적절한 값을 고릅니다.
  • 접두사 $2y$의 bcrypt 해시를 지원하는 Apache .htpasswd 파일의 항목을 만듭니다.

자주 묻는 질문

bcrypt 해시를 복호화할 수 있나요?

아니요. bcrypt는 단방향 함수라서 해시에서 비밀번호를 얻어 낼 방법이 없습니다. 가능한 것은 후보 비밀번호를 시도해 일치하는지 확인하는 것뿐이며, bcrypt는 바로 그 과정을 느리게 만듭니다.

$2a$, $2b$, $2y$의 차이는 무엇인가요?

일반적인 비밀번호에서는 세 가지 모두 같은 결과를 계산합니다. $2a$는 원래 버전입니다. $2y$는 2011년 PHP가 버그가 있는 구현의 해시와 구분하기 위해 도입했고, $2b$는 2014년 OpenBSD가 255자를 넘는 비밀번호와 관련된 다른 버그를 고치면서 채택했습니다. 대부분의 라이브러리는 검증할 때 세 가지를 모두 받아들입니다.

어떤 비용을 사용해야 하나요?

OWASP는 최소 10을 권장합니다. 서버가 로그인 1회당 약 250ms 안에 계산할 수 있는 가장 높은 값이 이상적입니다. Spring Security의 기본값은 10이며, Laravel 11과 PHP 8.4는 기본값을 12로 올렸습니다.

bcrypt는 왜 72바이트를 넘는 부분을 무시하나요?

이 알고리즘은 비밀번호를 Blowfish 키로 사용하는데, 이 키는 최대 72바이트까지 허용합니다. 넘는 부분은 경고 없이 버려지므로 처음 72바이트가 같은 두 비밀번호는 같은 해시가 됩니다. 악센트가 있는 문자나 이모지는 2~4바이트를 차지하므로 이 도구는 문자 수가 아니라 바이트 수를 셉니다.

bcrypt와 Argon2 중 무엇이 더 좋나요?

현재 새로운 시스템에는 Argon2id가 권장됩니다. 느릴 뿐 아니라 메모리를 많이 사용해 GPU 공격 비용을 높이기 때문입니다. 그래도 bcrypt는 적절한 비용이라면 여전히 안전하며 PHP, Laravel, Spring, Ruby on Rails의 기본값입니다.

비밀번호가 서버로 전송되나요?

아니요. 해시 생성과 검증은 브라우저에서 이루어지며 비밀번호는 기기 밖으로 나가지 않습니다. 도구를 공유하는 링크에도 포함되지 않습니다.