Home / AI / AI 용어사전 / 해시(Hash) — 비밀번호를 코드에 직접 저장하면 안 되는 이유
TERM
해시(Hash) — 비밀번호를 코드에 직접 저장하면 안 되는 이유
On this page
비밀번호를 평문으로 DB에 저장하는 서비스는 단 한 번의 침해 사고로 전체 사용자 계정을 잃는다. 해시는 이 구조적 위험을 원천 차단하는 단방향 변환 메커니즘이다.
정의
해시(Hash)는 임의 길이의 데이터를 고정 길이의 문자열로 변환하는 단방향 함수다. 같은 입력은 항상 같은 출력을 내지만, 출력으로부터 원래 입력을 복원하는 것은 계산상 불가능하다. 비밀번호 저장, 데이터 무결성 검증, 디지털 서명에 핵심 기술로 사용된다.
상세 설명
해시 함수의 세 가지 핵심 특성이 있다.
단방향성(One-way)은 해시 값으로부터 원본 데이터를 역산할 수 없는 성질이다. MD5·SHA-1은 수학적으로 단방향이지만 무차별 대입(Rainbow Table)으로 역추적이 가능해 현재 보안 용도로는 사용을 금한다.
충돌 저항성(Collision Resistance)은 서로 다른 두 입력이 같은 해시 값을 생성하지 않는 특성이다. SHA-256은 2^256개의 가능한 출력을 가져 실질적 충돌 가능성이 없다.
눈사태 효과(Avalanche Effect)는 입력이 1비트라도 바뀌면 출력이 완전히 달라지는 성질이다. "password"와 "Password"의 SHA-256 해시는 전혀 다른 값이 된다.
bcrypt vs SHA-256 선택 기준
비밀번호 저장에는 bcrypt·Argon2·scrypt처럼 의도적으로 느리게 설계된 알고리즘을 사용해야 한다. SHA-256은 초당 수십억 번 계산이 가능해 무차별 대입 공격에 취약하다. bcrypt는 비용 인수(cost factor)를 조정해 계산 속도를 늦추고 Rainbow Table 공격을 방어하는 솔팅(salt)을 자동 적용한다.
import bcrypt
# 비밀번호 해시 생성
password = b"user_password_123"
salt = bcrypt.gensalt(rounds=12) # cost factor 12
hashed = bcrypt.hashpw(password, salt)
# 검증 (평문 비밀번호를 DB에 저장하지 않음)
bcrypt.checkpw(b"user_password_123", hashed) # True
bcrypt.checkpw(b"wrong_password", hashed) # False활용 사례
- AI 서비스 사용자 비밀번호 저장 (bcrypt, Argon2 권장)
- API 요청 무결성 검증 — HMAC-SHA256 서명
- 파일 변조 감지 — 배포 전후 SHA-256 비교
- blockchain 블록 체인 연결 — 이전 블록 해시를 현재 블록에 포함
관련 용어
- encryption — 해시와 달리 양방향 변환. 복호화가 가능한 암호화
- salt — 같은 비밀번호라도 다른 해시를 생성하도록 추가하는 랜덤 값
- jwt — 서명 검증에 HMAC-SHA256 해시를 사용하는 토큰 표준
- oauth — 사용자 인증 흐름에서 상태 검증에 해시 사용
- blockchain — 블록 간 연결을 해시로 구현하는 분산 원장 기술