bcrypt이란 무엇인가요?
bcrypt는 Blowfish 블록 암호를 기반으로 한 비밀번호 해싱 함수로, 내장된 솔트와 조절 가능한 비용 인자를 포함한다. GPU와 전용 하드웨어에 의한 가속에 특히 저항하는 방식으로 계산 비용이 크도록 설계됐다.
다른 이름: bcrypt hash, Blowfish crypt
bcrypt는 대부분의 시스템이 MD5나 SHA-1 같은 빠른 해시 함수를 쓰던 1999년에 Niels Provos와 David Mazieres가 비밀번호 해싱을 위해 특별히 개발했다. 핵심 혁신은 비용 인자였다. 이는 기반이 되는 Blowfish 키 셋업을 몇 번 반복할지 제어하는 매개변수다. 비용 인자를 1 늘릴 때마다 계산 시간이 두 배가 되므로, 방어자는 하드웨어가 빨라짐에 따라 난이도를 키울 수 있다.
bcrypt가 PBKDF2와 다른 점은 GPU 가속에 대한 저항성이다. PBKDF2는 GPU 아키텍처에 잘 들어맞는 HMAC 연산을 사용해, 소비자용 GPU를 가진 공격자에게 막대한 병렬성을 허용한다. bcrypt의 Blowfish 기반 키 스케줄은 계산 중에 수정해야 하는 4KB 상태 테이블에 빈번히 접근해야 한다. 이 메모리 접근 패턴은 GPU에서 효율적으로 병렬화되지 않아 공격자를 CPU 속도로 되돌린다.
bcrypt는 알고리즘 버전, 비용 인자, 솔트, 해시를 함께 인코딩한 60자 문자열을 생성하므로 자체 완결적이고 이식 가능하다. 전형적인 bcrypt 해시는 $2b$12$... 형태이며 여기서 12가 비용 인자다. 현재 권장되는 최소 비용 인자는 10(현대 하드웨어에서 해시당 약 100ms)이지만, 약간 느린 로그인 시간을 감수할 수 있는 애플리케이션에서는 12~14가 흔하다. bcrypt는 거의 모든 프로그래밍 언어에서 사용할 수 있으며 여전히 가장 널리 쓰이는 비밀번호 해싱 알고리즘 중 하나다.
Vaulted가 bcrypt을 사용하는 방법
Vaulted는 패스프레이즈 기반 키 유도에 bcrypt 대신 PBKDF2를 사용한다. PBKDF2는 브라우저의 Web Crypto API를 통해 기본 제공되지만 bcrypt는 그렇지 않기 때문이다. Web Crypto API는 bcrypt를 제공하지 않으므로 이를 쓰려면 JavaScript 구현이 필요한데, 그러면 네이티브의 상수 시간 실행이 주는 보안 이점을 포기하게 된다. 인증을 위해 비밀번호를 해싱하는 서버 측 애플리케이션에서는 bcrypt가 여전히 훌륭한 선택이지만, 브라우저에서의 클라이언트 측 키 유도에는 Web Crypto 기반 PBKDF2가 표준적인 접근이다.