it-box

bcrypt

Blowfish 암호를 기반으로 하는 bcrypt로 텍스트 문자열을 해시하고 비교합니다.

bcrypt 도구 열기

bcrypt 해시가 입력 문자열과 일치하는지 확인하고, 비용 계수(round)에 따라 해시 생성 시간이 어떻게 달라지는지 봅니다.

사용 순서

  1. 테스트용 샘플 문자열을 준비합니다.
  2. 솔트 횟수 칸에 비용 계수를 넣고 해시를 생성합니다.
  3. 같은 문자열과 생성한 해시를 비교 칸에 넣어 일치 여부를 확인합니다.

예시

password123을 비용 10으로 해싱하면 매번 다른 해시가 나오지만, 두 해시 모두 원문과 비교할 때 일치로 판정됩니다.

한계

브라우저에서 계산하므로 기기 성능에 따라 시간이 달라지며, 서버의 실제 비용 계수와 같은 값을 보장하지는 않습니다. 솔트 횟수 칸은 0에서 100까지 받지만 bcryptjs는 0이면 10, 4 미만이면 4, 31을 넘으면 31로 처리하므로 실제 계수가 입력값과 다를 수 있습니다. 72바이트를 넘는 입력은 뒷부분이 무시됩니다.

보안 주의

실제 사용자 비밀번호나 운영 해시를 입력하지 마세요. 테스트 값만 사용하세요.

배경 지식

bcrypt는 비밀번호를 저장하기 위해 설계된 해시 함수입니다. 매번 무작위 솔트를 자동으로 만들어 해시에 붙이므로, 같은 비밀번호라도 저장되는 값이 달라집니다. 또한 계산량을 비용 계수로 조절할 수 있어, 공격자가 초당 수행할 수 있는 추측 횟수를 크게 낮춥니다. 이 때문에 빠른 해시를 비밀번호 저장에 쓰는 것은 권장되지 않습니다. 빠른 해시는 같은 시간에 훨씬 많은 추측을 허용하기 때문입니다.

비용 계수는 2의 거듭제곱으로 계산량이 늘어납니다. 계수가 1 올라갈 때마다 해시 생성 시간이 약 두 배가 되므로, 서버 성능과 로그인 응답 시간을 함께 고려해 값을 정해야 합니다. 값을 너무 낮게 잡으면 공격에 약해지고, 너무 높게 잡으면 로그인 요청마다 서버가 지연됩니다. 적절한 값은 서비스 부하와 허용 가능한 지연 시간을 함께 놓고 정하는 것이 일반적입니다.

자주 묻는 질문

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

아니요. bcrypt는 단방향 해시라서 해시 값으로 원문을 되돌릴 수 없습니다. 로그인 시에는 입력값을 다시 해싱해 저장된 해시와 비교합니다.

같은 비밀번호인데 해시가 매번 다른 이유는 무엇인가요?

매번 새로운 무작위 솔트가 생성되기 때문입니다. 솔트는 해시 문자열 안에 함께 저장되므로 검증할 때 자동으로 사용됩니다.

비용 계수는 얼마로 설정해야 하나요?

일반적으로 로그인 한 번이 서버에서 수백 밀리초 안팎으로 끝나는 값을 고릅니다. 정확한 값은 서버 하드웨어에서 직접 측정해 정하세요.