본문 바로가기
보안

bcrypt란? – 단방향 해시 알고리즘의 핵심 원리와 보안성(비밀번호가 포함된 DB가 털려도 안전한 이유)

by 오근성 2025. 4. 21.
728x90

🔐 bcrypt란? – 단방향 해시 알고리즘의 핵심 원리와 보안성

웹서비스에서 사용자의 비밀번호를 안전하게 저장하는 방법으로 가장 널리 쓰이는 기술 중 하나가 bcrypt입니다.
그런데 bcrypt는 단지 "해시함수"라고 하기엔 내부가 꽤 복잡하죠.

이번 글에서는
"bcrypt는 무엇이고 어떻게 동작하는가?"
그리고
"비밀번호가 포함된 DB가 털려도 안전한 이유는 뭔가?"
에 대해 아주 쉽게 설명드립니다.


✅ bcrypt는 무엇인가요?

bcrypt는 비밀번호를 안전하게 저장하기 위해 고안된 단방향 해시 함수입니다.

SHA256, SHA512와 같은 일반 해시 함수들과는 목적이 다릅니다.

비교 항목 일반 해시 함수 (SHA256 등) bcrypt
용도 무결성 확인, 빠른 처리 비밀번호 저장용
속도 매우 빠름 일부러 느림
솔트 처리 따로 붙여야 함 자동 포함
중복 방지 없음 (같은 입력 = 같은 해시) 있음 (랜덤 솔트로 매번 다름)

🔁 왜 bcrypt는 단방향인가요?

bcrypt는 내부적으로 Blowfish 암호화 알고리즘을 기반으로 합니다.
하지만 일반적인 암복호화 구조와 달리, bcrypt는 다음 특징을 갖습니다:

  • EksBlowfishSetup 과정을 통해 비밀번호 + 솔트로 복잡한 키 테이블을 생성
  • 이 키 테이블은 매번 새로 만들고, 사용 후에는 휘발됨 (복구 불가)
  • 결과적으로 입력을 넣으면 항상 같은 결과는 나오지만, 그 역은 구할 수 없습니다

✔️ 같은 재료를 다시 넣으면 같은 요리를 만들 수 있지만,
🍲 완성된 요리만 보면 재료를 알 수 없는 구조입니다.


🧂 bcrypt는 솔트를 어떻게 다르게 사용하나요?

  • bcrypt 해시 결과는 문자열 한 줄에 버전, 반복 횟수, 솔트, 해시 결과가 모두 포함되어 있습니다.

예시:

$2b$12$NxoG7tUiqdmX8gclzZsCz.TmRb9Cd/U05FZUv.yKFXnM9fT.WZkQO
구간 설명
$2b$ bcrypt 버전
12 반복 횟수 (2¹² = 4096회 반복)
NxoG7tU... 솔트 (128비트 랜덤)
TmRb9Cd... 최종 해시 결과

✅ 이 해시값 하나만 있으면 검증에 필요한 모든 정보를 재구성할 수 있습니다!


🔐 DB가 털려도 비밀번호는 왜 안전할까요?

비밀번호 유출을 막는 bcrypt의 방어 메커니즘은 다음과 같습니다:

방어 방식 설명
랜덤 솔트 같은 비밀번호라도 해시값이 다르게 생성됨
느린 계산 해시 1개 계산에 수백 밀리초 소요 → 대량 공격 어렵게 만듦
레인보우 테이블 무력화 솔트 덕분에 사전 계산된 해시 테이블이 소용없음
중간 키 휘발성 해시 생성 중 사용된 내부 상태 정보는 외부에 노출되지 않음

DB가 털려도 bcrypt 해시만으로는 원래 비밀번호를 복원할 수 없습니다.
이유는 "입력값 없이 동일한 내부 상태를 만들 수 없기 때문"입니다.


🧪 비밀번호는 어떻게 검증되나요?

  1. 사용자가 비밀번호 입력 (password123)
  2. DB에서 bcrypt 해시값을 불러옴 (해시 안에 솔트와 라운드 수 포함)
  3. 입력값과 해시에 포함된 솔트로 다시 bcrypt 계산
  4. 결과가 기존 해시와 같으면 → 비밀번호 일치!
import bcrypt

# 저장된 해시
stored = b"$2b$12$NxoG7tUiqdmX8gclzZsCz.TmRb9Cd/U05FZUv.yKFXnM9fT.WZkQO"

# 사용자가 입력한 비밀번호
input_password = "password123"

# 검증
bcrypt.checkpw(input_password.encode(), stored)
# → True (비밀번호 일치)

✅ 정리 요약

질문 답변 요약
bcrypt는 왜 단방향인가요? 내부 암호화 상태(중간 키)를 휘발시켜 복호화가 불가능함
해시만 보고 비밀번호 알 수 있나요? ❌ 단방향 + 랜덤 솔트 덕분에 불가능함
DB가 털려도 안전한가요? ✅ 충분히 안전하지만, 추가 보안 조치도 필요함
어떻게 검증되나요? 같은 솔트와 라운드 수로 다시 해시 → 결과 비교

📘 다음으로 추천하는 주제

  • 🔄 bcrypt vs Argon2 vs PBKDF2 – 뭐가 더 좋을까?
  • 🔐 Django / Node.js에서 bcrypt 적용하기
  • ⚠️ 비밀번호 정책과 2단계 인증(2FA)까지 같이 적용하는 이유

궁금한 게 있다면 언제든지 댓글이나 메시지로 질문 주세요!

728x90

'보안' 카테고리의 다른 글

솔트(Salt)란 무엇이고? 왜 꼭 써야 할까?  (0) 2025.04.21

댓글