암호화 · 해시

BCrypt 해시 검증

입력한 문자열과 BCrypt 해시값이 일치하는지 검증합니다.


해시값
문자열

일치

불일치

Tips

  • BCrypt는 솔트를 내포하기 때문에, 해시값이 매번 달라도 같은 원래 문자열에서 생성된 것이라면 일치로 판정됩니다.
  • PHP의 password_verify($password, $hash)와 같은 방식으로 검증합니다.
  • 데이터베이스에서 가져온 해시값과 입력 비밀번호를 대조할 때는 일반 문자열 비교(==)가 아닌 전용 검증 함수를 사용하여 타이밍 공격을 방지하세요.
  • $2a$로 시작하는 해시값도 BCrypt로 검증할 수 있습니다.

여담 ― 인증의 이면 ― 로그인의 "그 0.몇 초"의 정체

웹 서비스에서 로그인 버튼을 누르고 결과가 돌아올 때까지의 0.몇 초. 사실 이 시간의 일부는 BCrypt가 비밀번호의 해시 계산을 하는 시간입니다. 보안을 위해 "의도적으로" 시간을 들이고 있는 것입니다.

타이밍 공격(Timing Attack)이란 처리 시간의 미묘한 차이를 측정하여 비밀 정보를 추측하는 사이드 채널 공격의 일종입니다. 일반 문자열 비교(==)로 비밀번호를 검증하면 문자가 일치하는 위치에 따라 비교 시간이 약간 달라집니다. BCrypt의 검증 함수는 상수 시간으로 동작하도록 설계되어 있어 이 공격에 대해 안전합니다.

실제 웹 앱에서는 사용자가 존재하지 않는 경우에도 "존재하지만 비밀번호가 틀렸다"와 동일한 정도의 시간을 들여 응답을 반환하는 것이 권장됩니다. "사용자가 존재하지 않습니다"와 "비밀번호가 틀렸습니다"를 구별할 수 있으면 공격자에게 유효한 사용자 이름을 특정할 단서가 될 수 있기 때문입니다.