Bcrypt 해시 생성기

Bcrypt로 해시를 만들고 일치 여부를 검증합니다.


해시 검증

코스트가 높을수록 느리고 안전합니다(12 이상은 수 초 걸릴 수 있음). 모든 처리는 브라우저에서만 이뤄집니다.

로그인 기능을 만들다 보면 DB에 저장된 $2a$10$... 같은 문자열을 마주칩니다. 이 도구로 같은 값을 직접 만들어 보고, 평문과 해시가 실제로 짝이 맞는지 확인할 수 있습니다. 테스트 계정 비밀번호를 급히 만들거나 로그인 검증이 왜 실패하는지 확인할 때 씁니다.

어떻게 계산되나요

해시 생성

문자열을 입력하고 코스트(rounds) 를 고른 뒤 해시 생성을 누르면 결과가 나옵니다. 같은 문자열이라도 실행할 때마다 결과가 달라지는데, bcrypt가 매번 무작위 솔트를 섞기 때문입니다. 결과가 다르다고 잘못된 것이 아닙니다.

해시 문자열 읽는 법

$2a$10$N9qo8uLOickgx2ZMRZoMye...
 │   │  └ 솔트 22자 + 해시 31자
 │   └ 코스트(2^10 = 1,024회 반복)
 └ 알고리즘 식별자

코스트는 1 올릴 때마다 계산량이 두 배가 됩니다. 이 도구에서는 8·10·12·14 중에 고를 수 있고, 12 이상은 브라우저에서 몇 초 걸릴 수 있습니다. OWASP 비밀번호 저장 가이드는 bcrypt를 쓸 경우 작업 인자 10 이상을 권하며, 서버 성능이 허용하는 범위에서 더 높이라고 안내합니다(작성 시점 기준). 다만 새로 만드는 시스템이라면 Argon2id를 우선 검토하라는 것이 같은 문서의 권고입니다.

해시 검증

아래 검증 영역에 평문bcrypt 해시를 각각 넣고 검증을 누르면 일치 여부만 알려줍니다. 해시에서 원래 문자열을 되돌리는 것은 불가능하고, 저장된 해시와 대조하는 방식으로만 확인합니다. 해시 문자열을 붙여넣을 때 앞뒤 공백이나 줄바꿈이 섞이면 형식 오류가 납니다.

한 가지 주의점: bcrypt는 입력 72바이트까지만 반영합니다. 그보다 긴 문자열은 뒷부분이 계산에 들어가지 않습니다. 모든 처리는 브라우저 안에서만 이뤄지지만, 실제 서비스에서 쓰는 비밀번호를 그대로 넣기보다 테스트용 값을 쓰시길 권합니다.

용어 정리

코스트(rounds)
반복 횟수를 정하는 값. 2의 거듭제곱으로 작용해 1 올리면 계산 시간이 두 배가 됩니다.
솔트(salt)
해시마다 무작위로 붙는 값. 같은 비밀번호라도 결과가 달라져 미리 만든 해시표 공격을 막습니다.
$2a$ / $2b$
bcrypt 해시의 버전 식별자. 구현체에 따라 표기가 다를 수 있지만 서로 호환됩니다.
단방향 해시
되돌릴 수 없는 변환. 원문을 복구할 수 없고 비교만 가능합니다.
Argon2id
현재 비밀번호 저장에 우선 권장되는 최신 해시 알고리즘입니다.

자주 묻는 질문

같은 비밀번호인데 왜 매번 다른 해시가 나오나요?

bcrypt는 해시할 때마다 새로운 무작위 솔트를 만들어 섞기 때문입니다. 결과 문자열은 달라도 검증 기능으로 확인하면 모두 원래 평문과 일치합니다. 솔트가 해시 문자열 안에 함께 들어 있어 별도로 저장할 필요가 없습니다.

코스트는 몇으로 하는 게 좋나요?

서버가 감당할 수 있는 선에서 높을수록 좋습니다. OWASP는 bcrypt 사용 시 작업 인자 10 이상을 권고합니다(작성 시점 기준). 로그인 응답 시간과 서버 부하를 실제로 측정해 정하고, 정확한 기준은 공식 문서를 확인하세요.

해시에서 원래 비밀번호를 알 수 있나요?

없습니다. bcrypt는 단방향 함수라 복호화가 불가능합니다. 확인하려면 후보 문자열을 넣어 일치하는지 비교하는 방법뿐이며, 이 도구의 검증 기능이 그 역할을 합니다.

PHP password_hash로 만든 해시도 검증되나요?

PHP의 password_hash()가 기본으로 만드는 bcrypt 해시($2y$로 시작)는 같은 알고리즘입니다. 다만 구현체에 따라 접두사 처리 방식이 달라 검증 결과가 어긋날 수 있으니, 실제 확인은 해당 언어의 검증 함수로 하는 것이 정확합니다.

입력한 값이 서버로 올라가나요?

아닙니다. 생성과 검증 모두 브라우저에서 처리되며 서버로 전송되지 않습니다. 그래도 운영 중인 서비스의 실제 비밀번호는 넣지 말고 테스트용 문자열로 확인하시길 권합니다.