정의
bcrypt는 비밀번호와 같은 비밀 데이터를 안전하게 저장하기 위해 설계된 암호학적 해시 함수이다. 주로 비밀번호 해싱에 사용되며, 고유한 솔트와 적응형 작업 비용을 결합하여 무차별 대입 공격(brute‑force attack) 및 사전 공격(dictionary attack)에 대한 저항성을 높인다.
개요
bcrypt는 1999년 미국의 컴퓨터 과학자 Niels Provos와 David Mazières가 발표한 암호학 논문 “A Future‑Adaptable Password Scheme”에서 소개되었다. Blowfish 대칭키 암호 알고리즘을 기반으로 한 Eksblowfish(Expensive Key Schedule Blowfish)라는 변형을 사용한다. 입력된 비밀번호와 무작위로 생성된 128비트 솔트가 결합된 후, 지정된 라운드 수(작업 비용)만큼 반복 해시 연산을 수행한다. 작업 비용은 2ⁿ 형태의 정수(예: 2¹⁰, 2¹² 등)로 지정되며, 하드웨어 성능이 향상됨에 따라 비용 파라미터를 증가시켜 해시 계산 시간을 조정할 수 있다.
어원/유래
“bcrypt”라는 명칭은 Blowfish 암호와 “crypt”(암호화)라는 단어의 결합에서 유래하였다. Eksblowfish 알고리즘을 이용해 비밀번호를 암호화한다는 의미를 담고 있다. 최초 제안자는 위 논문에서 이 방식을 “bcrypt”라고 명명하였다.
특징
| 특징 | 내용 |
|---|---|
| 솔트 사용 | 128비트 무작위 솔트를 자동으로 생성·저장하여 동일 비밀번호라도 서로 다른 해시 값을 만든다. |
| 작업 비용 조정 | 비용 파라미터를 2ⁿ 형태로 지정해 해시 연산 횟수를 조정함으로써 계산 비용을 조절한다. |
| 적응형 보안 | 하드웨어 성능이 향상될 경우 비용 파라미터를 증가시켜 기존 해시의 보안 수준을 유지한다. |
| 키 스트레치(key stretching) | 동일 비밀번호에 대해 여러 차례의 해시 연산을 수행해 공격자가 단일 연산당 얻는 정보를 감소시킨다. |
| 표준화 | 여러 프로그래밍 언어와 라이브러리(예: OpenBSD, PHP, Python, Node.js 등)에서 표준 구현을 제공한다. |
| 출력 형식 | $2a$, $2b$, $2y$ 등으로 시작하는 60문자 문자열 형태(버전 및 비용 정보를 포함)로 저장된다. |
관련 항목
- Blowfish: bcrypt가 기반으로 하는 대칭키 블록 암호 알고리즘.
- PBKDF2: 비밀번호 기반 키 파생 함수, bcrypt와 유사한 목적을 가진 다른 표준.
- scrypt: 메모리 비용을 추가로 고려한 비밀번호 해시 함수.
- Argon2: 2015년 비밀번호 해시 경연(Password Hashing Competition)에서 최종 승리한 최신 해시 함수.
- Salt (솔트): 해시값에 무작위 데이터를 추가해 사전 공격을 방어하는 기술.
- Key Stretching: 연산 비용을 인위적으로 늘려 공격 난이도를 높이는 방법.
※ 본 내용은 공개된 기술 문서와 학술 논문, 주요 암호 라이브러리의 구현 설명을 기반으로 작성되었으며, 최신 버전의 사양 및 구현에 따라 세부 사항이 변동될 수 있다.