Bcrypt 검증기
비밀번호와 bcrypt 해시 일치 여부 확인
📖 bcrypt는 salt를 따로 안 저장하는데 어떻게 검증하나 — compare()의 실제 동작 가이드 보기
Bcrypt 검증기란?
bcryptjs 라이브러리의 bcrypt.compare()로 평문 비밀번호와 저장된 bcrypt 해시를 비교합니다. bcrypt 해시 문자열 자체가 $버전$cost$salt+해시결과 구조라 salt가 이미 해시 안에 내장되어 있으므로, compare() 내부에서 해시 앞부분(첫 29자)을 salt로 그대로 재사용해 같은 조건으로 다시 해싱한 뒤 나머지 부분과 비교합니다. 입력 형식 검사는 $2, $2a$, $2b$, $2x$, $2y$ 버전 접두사를 모두 허용하는데, 특히 $2y$는 PHP의 password_hash()가 기본으로 생성하는 형식이라 Laravel·WordPress 등 PHP 기반 서비스의 해시를 그대로 붙여넣어 검증할 수 있어야 합니다. 로그인 구현이나 bcrypt 라이브러리 동작 테스트에 유용하며, 비밀번호와 해시는 브라우저 안에서만 처리되고 서버로 전송되지 않습니다.
자주 묻는 질문
bcrypt 검증은 어떻게 작동하나요?
해시 문자열 앞부분(버전+cost+salt, 총 29자)을 그대로 salt로 재사용해 입력 비밀번호를 동일한 cost로 다시 해싱하고, 그 결과를 저장된 해시의 나머지 부분과 비교합니다. 평문끼리 비교하는 게 아니라 해시 결과끼리 비교하는 방식입니다.
bcrypt 해시 버전(2, 2a, 2b, 2x, 2y)은 다 검증되나요?
네, 이 도구는 $2$, $2a$, $2b$, $2x$, $2y$ 접두사를 모두 유효한 형식으로 인식합니다. 특히 PHP의 password_hash()가 기본 생성하는 $2y$ 형식은 실무에서 매우 흔하므로, Laravel·WordPress 등에서 가져온 해시도 형식 오류 없이 그대로 검증할 수 있습니다.
같은 비밀번호인데 왜 검증에 실패하나요?
bcrypt 해시 문자열이 정확한지 먼저 확인하세요. 해시는 버전·cost·salt·결과값이 하나로 이어진 문자열이라 한 글자만 달라져도 검증에 실패하며, 비밀번호의 대소문자·공백·특수문자도 정확히 일치해야 합니다.
비밀번호와 해시가 서버로 전송되나요?
아니요. bcryptjs 라이브러리가 브라우저에서만 실행되며 입력값은 네트워크로 전송되지 않습니다.
검증 속도가 느린 이유는?
bcrypt는 Blowfish 기반 키 스케줄을 cost factor에 지정된 횟수(2^cost번)만큼 반복해 의도적으로 느리게 설계되어 있습니다. 무차별 대입 공격 비용을 높이기 위한 설계이며, cost factor가 1 오를 때마다 연산량이 2배가 됩니다.
bcrypt 검증 시간은 얼마나 걸리나요?
일반적인 데스크톱 브라우저 기준 cost 10은 약 100ms, cost 12는 약 400ms 정도로, cost가 2 오르면 소요 시간이 대략 4배가 됩니다. 정상적인 동작이며 느려 보여도 오류가 아닙니다.
해시를 생성하려면?
bcrypt-generator 도구에서 비밀번호를 원하는 cost factor의 bcrypt 해시로 변환할 수 있습니다.
bcrypt 검증이 실패하는 일반적인 원인은?
잘못된 비밀번호, 복사 과정에서 손상되거나 잘린 해시, 비밀번호 앞뒤에 실수로 들어간 공백, 지원하지 않는 해시 알고리즘(bcrypt가 아닌 다른 형식)을 붙여넣은 경우 등이 흔한 원인입니다.