Bcrypt 해시 생성기·검증

브라우저에서 bcrypt 해시를 생성하고 검증합니다. $2b$·$2y$·$2a$와 비용 4–31을 고르고, 72바이트 한도와 Spring·PHP·Node.js·Go·Laravel이 그 해시를 받아들이는지 확인하세요. 비밀번호는 전송하지 않습니다.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
해시를 검증할 프로그램이 지원하는 접두사를 고릅니다. PHP·Laravel은 $2y$, Node.js bcrypt는 $2b$를 사용합니다. 아래 설명에 선택한 접두사의 호환성을 표시합니다.
비용은 4–31이며 기본값은 12입니다. 1씩 올릴 때마다 계산량이 두 배가 됩니다. 이 브라우저의 실측 속도에 따른 추정치이므로 로그인 서버에서도 측정하세요.
「해시 생성」을 누르면 매번 무작위 16바이트 솔트로 계산합니다. 결과는 접두사, 비용, 22자 솔트, 31자 해시로 나뉩니다. 「취소」로 현재 계산을 멈춥니다.

UTF-8 바이트 수를 셉니다. bcrypt는 앞 72바이트만 읽습니다. 공백과 줄 바꿈도 포함하며 유니코드 정규화는 하지 않습니다. 한도를 넘으면 경고합니다.

해시는 이 탭의 Web Worker에서 계산합니다. 비밀번호와 해시는 어디로도 보내거나 저장하지 않으며, 이 페이지는 분석 도구와 광고를 불러오지 않습니다.

예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

예시: Spring Security의 {bcrypt} 저장값

Spring Security 7.1.1의 PasswordEncoderFactories.createDelegatingPasswordEncoder()로 우리집강아지2026을 인코딩하면 다음 값이 나옵니다(2026-10-02 실행). 이 값을 그대로 붙여 넣으면 이 페이지는 앞의 {bcrypt}를 떼고 검증해 「일치」를 보여 줍니다.

{bcrypt}$2a$10$YNfXOCtLgUC6YN84nk7njuohGwEWGbk2NRKH27SD9weV1Hw3LxWz.

반대로 이 페이지에서 만든 $2a$ 해시를 {bcrypt} 없이 DB에 넣으면, DelegatingPasswordEncoder는 로그인할 때 IllegalArgumentException: Given that there is no default password encoder configured, each password must have a password encoding prefix.를 던집니다(6.5.11과 7.1.1에서 확인). BCryptPasswordEncoder를 직접 빈으로 등록한 프로젝트라면 접두사 없이 넣어야 합니다. 어느 쪽인지는 SecurityConfig의 PasswordEncoder 빈을 보면 알 수 있습니다.

예시: 복사하다 망가진 해시

로그나 메신저에서 복사한 해시는 끝이 잘리거나 다른 문자가 섞이기 쉽습니다. 이 페이지는 몇 번째 문자가 문제인지 알려 줍니다. 아래 값은 41번째 문자가 bcrypt 문자가 아닌 !입니다.

$2a$10$YNfXOCtLgUC6YN84nk7njuohGwEWGbk2N!KH27SD9weV1Hw3LxWz.

마지막 문자의 패딩 비트가 0이 아닌 해시도 따로 알려 줍니다. 이런 해시는 Python bcrypt가 「Invalid salt」를 내고 PHP·Node.js·Spring은 비밀번호가 맞아도 불일치로 판정하므로, 이 페이지는 정규 형식을 계산해 함께 보여 줍니다.

접두사별 호환성

UTF-8 비밀번호라면 $2a$, $2b$, $2y$는 같은 알고리즘입니다. $2y$는 crypt_blowfish가 8비트 문자 버그(CVE-2011-2483)를 고친 뒤의 표시, $2b$는 OpenBSD가 2014년에 바꾼 표시이고, crypt_blowfish 1.3은 $2b$를 $2y$와 「정확히 같게」 처리합니다(Openwall). 차이는 라이브러리가 받아들이느냐이며, 2026-10-02에 같은 해시로 확인한 결과는 다음과 같습니다.

라이브러리버전$2a$$2b$$2y$72바이트 초과 생성기본 출력
Spring Security 7.1.1✓✓✓✗ 오류$2a$10$
Spring Security 6.5.11✓✓✓✗ 오류$2a$10$
Go x/crypto/bcrypt 0.57.0✓✓✓✗ 오류$2a$10$
Node.js bcrypt 6.0.0✓✓✗ false✂ 잘라 냄$2b$10$
Node.js bcryptjs 3.0.3✓✓✓✂ 잘라 냄$2b$10$
Python bcrypt 5.0.0✓✓✓✗ 오류$2b$12$
Python bcrypt 4.2.0✓✓✓✂ 잘라 냄$2b$12$
PHP password_verify 8.4.26✓✓✓✂ 잘라 냄$2y$12$
Laravel Hash::check 13.34.0⚠ 예외⚠ 예외✓✂ 잘라 냄$2y$12$
Symfony 8.1.0✓✓✓SHA-512 먼저$2y$13$

Java·Go·Python은 셋 다 괜찮고, PHP 계열은 $2y$, Node.js는 $2b$를 쓰면 됩니다. 접두사만 바꿔도 해시는 그대로 유효하며, 「검증」 탭이 다른 두 형식을 바로 보여 줍니다.

한글 비밀번호와 72바이트

bcrypt는 비밀번호의 앞 72바이트만 읽습니다. 한글 음절은 UTF-8로 한 글자에 3바이트라 24자면 한도에 닿습니다. 아래 25자는 75바이트여서, 이 페이지는 「…고올해로다섯살이되었습니」 뒤는 무시된다고 경고합니다.

우리집강아지이름은초코이고올해로다섯살이되었습니다

마지막 「다」를 다른 글자로 바꿔도 결과는 「일치」입니다. 라이브러리마다 처리도 다릅니다. 우리가 확인한 Spring Security는 6.2.8까지는 잘라 내고, 6.3.10부터는 encode()에서 password cannot be more than 72 bytes를 던집니다. 그래서 오래된 버전에서 만든 긴 비밀번호의 해시는 6.3 이후에도 matches()로는 통과하지만, 같은 비밀번호로 다시 인코딩하려 하면 예외가 납니다.

비용 정하기

비용은 2의 지수입니다. 비용 12는 키 설정을 212 = 4,096번 반복하며 11보다 두 배 오래 걸립니다. OWASP Password Storage Cheat Sheet는 최소 10을 요구하고, bcrypt는 「Argon2와 scrypt를 쓸 수 없는 레거시 시스템에서만」 쓰라고 합니다. 새로 만드는 시스템이라면 Argon2id를 먼저 검토하세요. Spring Security에서는 new BCryptPasswordEncoder(12)처럼 생성자로 비용을 정합니다. 이 페이지의 소요 시간은 브라우저의 JavaScript 구현 기준이므로 서버에서 다시 재어 보세요.

다른 도구와 다른 점

2026-10-02에 Bing에서 「bcrypt 생성기」 상위에 나오는 Go Tools 한국어판을 같은 입력으로 시험했습니다. 계산은 브라우저의 Web Worker에서 하고 접두사도 고를 수 있지만, 73바이트 비밀번호를 앞 72바이트의 해시와 비교하자 경고 없이 「일치」였고, !가 들어간 해시에는 「검증할 bcrypt 해시를 입력하세요」라고만 나왔으며, $2x$ 해시에서는 「생성 중…」에서 멈췄습니다. 같은 날 확인한 MiniWebtool 일본어판은 비밀번호를 폼으로 서버에 POST했습니다. 이 페이지는 통신하지 않고, 불일치의 원인을 구체적으로 알려 줍니다.

제한

  • 계산은 bcryptjs 2.4.3으로 합니다. 비용 31까지 고를 수 있지만 브라우저에서는 며칠이 걸리므로 「취소」로 멈출 수 있습니다.
  • $2x$(옛 crypt_blowfish 버그로 만든 해시)는 비밀번호가 모두 ASCII일 때만 $2a$로 검증합니다.
  • 입력한 글자를 그대로 UTF-8로 바꾸며 유니코드 정규화는 하지 않습니다.
  • bcrypt 전용입니다. Argon2·scrypt·SHA-crypt 등은 이름만 알려 주고 검증하지 않습니다. Apache·Nginx용 파일은 htpasswd 생성기, 무작위 비밀번호는 비밀번호 생성기로 만들 수 있습니다.

FAQ

Spring Boot에서 쓸 해시는 어떻게 만드나요?

접두사 $2a$, 비용 10으로 생성하면 Spring Security의 BCryptPasswordEncoder가 직접 만드는 값과 같은 형식입니다. PasswordEncoderFactories로 만든 DelegatingPasswordEncoder를 쓴다면 DB에 넣을 때 앞에 {bcrypt}를 붙여야 합니다.

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

없습니다. bcrypt는 단방향 해시라 키도 역연산도 없습니다. 검증은 해시에 들어 있는 솔트와 비용으로 입력한 비밀번호를 다시 계산해 비교하는 것입니다. 잊어버린 비밀번호는 새 해시를 만들어 다시 저장해야 합니다.

한글 비밀번호는 몇 자까지 쓸 수 있나요?

bcrypt는 앞 72바이트만 읽고, 한글 음절은 UTF-8로 한 글자에 3바이트라 24자까지입니다. 25번째 글자부터는 결과에 영향을 주지 않습니다. Spring Security 6.3 이상은 72바이트를 넘는 비밀번호의 encode()를 거부합니다.

비용은 얼마로 해야 하나요?

OWASP는 최소 10을 요구합니다. Spring Security·Node.js bcrypt·Go의 기본값은 10, PHP 8.4·Laravel·Python은 12입니다. 로그인을 처리하는 서버에서 직접 재어 1초보다 충분히 짧은 범위에서 가장 큰 값을 고르세요.

비밀번호가 어딘가로 전송되나요?

전송되지 않습니다. 계산은 이 탭의 Web Worker에서 하며 비밀번호와 해시를 보내거나 저장하지 않습니다. 이 페이지는 분석 도구와 광고를 불러오지 않습니다.