[CS/보안] BCrypt

gyeol·2025년 10월 24일

CS

목록 보기
9/13
post-thumbnail

BCrypt

비밀번호 전용 단방향 해시 함수로, 단방향 함수이기에 복호화가 불가능하다. 내부적으로 Blowfish 기반의 Eksblowfish를 이용해 무차별 대입 공격에 강하다는 특징을 가진다.

  1. 입력받은 비밀번호와 무작위 salt 결합
  2. Blowfish의 키 확장을 2^cost번 반복
  3. 최종적으로 64비트 블록을 여러번 암호화하여 해시 생성
  4. 결과값은 $2b$[cost]$[salt][hash] 저장

Blowfish?
➡️ 대칭키 블록 암호화 알고리즘
BCrypt는 일반 Blowfish를 그대로 쓰지 않고, 키 확장(Key Schedule) 과정을 매우 느리게 만든 변형 알고리즘을 사용한다.

해시 결과 구조

BCrypt는 해시 문자열 하나에 버전, 비용, 솔트, 해시를 모두 포함한다.

$2b$10$C6UzMDM.H6dfI/f/IKcEeO5rY9zG3o9x6kQd6k1mKqTzVtCwV8B5a
││  │  │                    │                  └─ 31자 해시(Base64 변형)
││  │  │                    └─ 22자 솔트(Base64 변형)
││  │  └─ 비용 인자(cost) = 10 (2^10 라운드)
││  └─ 구분자
│└─ 알고리즘 버전: $2a$ / $2b$ / $2y$ (현행은 주로 $2b$)
└─ 구분자

즉, 복호화가 불가능하기에 사용자가 비밀번호를 입력하면 동일한 BCrypt 알고리즘을 통해 동일한 해시값이 만들어지는지를 비교하여 유요한 비밀번호인지를 판단한다.

해시 암호?

해시 함수는 임의 길이의 입력값을 고정된 길이의 출력값으로 바꿔주는 단방향 암호화 함수이다. 입력값이 달라지면 전혀 다른 결과가 나오기에 결과값 해시로부터 원래 입력을 복원할 수 없다.

특징설명
단방향성 (One-way)해시 결과로부터 원래 데이터를 복호화할 수 없음
충돌 회피성 (Collision Resistance)서로 다른 두 입력이 동일한 해시를 만들 확률이 극히 낮음
결정적 특성 (Deterministic)같은 입력 → 항상 같은 해시 출력
빠른 연산단순 해시 함수는 매우 빠르게 계산 가능 (하지만 BCrypt처럼 느리게 설계할 수도 있음)

일반 해시 함수 예시

  • MD5, SHA-1, SHA-256 : 일반적인 데이터 무결성 검증용
  • BCrypt, PBKDF2, scrypt : 비밀번호용 해시

비밀번호를 해시로 저장하게 되면 데이터베이스 탈취 시에도 원본이 노출되지 않기에 보안성에 강하다. 단순 SHA-256만을 사용하게 되면 레인보우 테이블을 이용해 역추적당할 수 있기에 BCrypt처럼 salt와 반복 연산이 있는 알고리즘을 사용해야 한다.

레인보우 테이블?
레인보우 테이블은 비밀번호 -> 해시값의 대응 관계를 미리 대량으로 계산해둔 표이다. 즉, 공격자가 비밀번호를 일일이 해시 계산하지 않아도 역추적할 수 있다.

salt를 사용하는 이유?

그냥 해시 함수를 통해 암호화만 진행한다면 레인보우 테이블을 통해 역추적 가능하기에 비밀번호 앞 뒤에 랜덤 문자열을 붙여준다. 이를 바로 salt라고 한다.

비밀번호: 1234
솔트: x1Yz9K
결과 해시: hash("x1Yz9K1234") = A83D2F...
profile
공부 기록 공간 '◡'

0개의 댓글