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 해시만으로는 원래 비밀번호를 복원할 수 없습니다.
이유는 "입력값 없이 동일한 내부 상태를 만들 수 없기 때문"입니다.
🧪 비밀번호는 어떻게 검증되나요?
- 사용자가 비밀번호 입력 (
password123
) - DB에서 bcrypt 해시값을 불러옴 (해시 안에 솔트와 라운드 수 포함)
- 입력값과 해시에 포함된 솔트로 다시 bcrypt 계산
- 결과가 기존 해시와 같으면 → 비밀번호 일치!
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 |
---|
댓글