728x90
반응형
사용자 비밀번호를 안전하게 저장하기 위해 암호화(Encryption) 혹은 해싱(Hashing) 기법이 사용됩니다.
그중에서도 SHA-256은 널리 사용되는 해시 함수이며, 여기에 Salt(솔트) 값을 조합하면 보안 수준을 한층 높일 수 있습니다.
이 글에서는 Salt + SHA-256 조합의 필요성과 사용법을 설명하고, Python 예제도 함께 제공합니다.
SHA-256 이란?
SHA-256은 SHA(Secure Hash Algorithm) 계열 중 하나로,
256비트(32바이트) 길이의 해시값을 생성합니다. 다음과 같은 특징을 갖습니다.
- 입력이 같으면 출력(해시값)이 항상 같음
- 출력은 고정 길이(64자 HEX 문자열)
- 역으로 복호화 불가능 (단방향)
📌 예시:
import hashlib
password = "mypassword123"
hashed = hashlib.sha256(password.encode()).hexdigest()
print(hashed)
# 출력: e99a18c428cb38d5f260853678922e03abd8335...
하지만 이 방식만 사용할 경우 보안에 취약합니다. 그 이유는 ???
왜 Salt가 필요한가?
SHA-256 해시값은 같은 입력 → 같은 출력의 특성 때문에,
공격자가 사전공격(Dictionary Attack) 혹은 레인보우 테이블 공격(Rainbow Table Attack) 으로 손쉽게 유추할 수 있습니다.
예시 문제점:
- user1과 user2가 모두 password123을 비밀번호로 쓸 경우, 해시값이 완전히 동일하게 저장됩니다.
해결책: Salt
Salt란? 해시 전에 비밀번호에 임의의 문자열(랜덤값) 을 추가하여 해시값을 다르게 만드는 보안 기법입니다.
📌 예시:
password = "mypassword123"
salt = "a1b2c3d4"
hashed = hashlib.sha256((salt + password).encode()).hexdigest()
- 같은 비밀번호라도 다른 Salt가 쓰이면 해시값이 다릅니다.
- Salt는 보통 랜덤하게 생성해서 DB에 저장하거나, 사용자마다 고유하게 부여합니다.
실제 구현 예시 (Python)
import hashlib
import os
# 1. Salt 생성 (16바이트 랜덤값을 hex로 인코딩)
def generate_salt():
return os.urandom(16).hex()
# 2. 비밀번호 해시 함수
def hash_password(password, salt):
return hashlib.sha256((salt + password).encode()).hexdigest()
# 3. 사용 예시
raw_password = "mypassword123"
salt = generate_salt()
hashed_pw = hash_password(raw_password, salt)
print(f"Salt: {salt}")
print(f"Hashed PW: {hashed_pw}")
📌 출력 예시:
Salt: a2f54d18ee9ccfc1de3e9a0e55dbbc8f
Hashed PW: 749f270db00e9b5ea03e2d6dcd16ecf2...
DB 저장 방식
실제 사용자 인증 시스템에서는 보통 다음과 같이 저장합니다:
| user_id | salt | hashed_password |
| user1 | a2f5... | 749f270d... |
인증 시에는 입력한 비밀번호에 해당 사용자의 salt를 붙여 동일한 방식으로 해시 후 비교합니다.
보안을 더 강화하려면?
- 단순 SHA256은 반복 횟수나 키 스트레칭이 없음 → 추천: bcrypt, scrypt, PBKDF2 사용
- 하지만 Salt + SHA256 조합만으로도 보안성이 기본보다는 훨씬 높아집니다.
✅ 마무리 & 정리
| 용어 | 설명 |
| 해시(Hash) | 단방향 암호화 방식으로 복호화 불가 |
| SHA-256 | 대표적인 해시 알고리즘 중 하나 |
| Salt | 해시 전에 추가하는 랜덤 문자열로 해시값 중복 방지 |
| 보안 강화법 | Salt 추가, 해시 반복, 더 안전한 알고리즘 사용 |
- SHA-256만 사용하는 것은 보안상 위험
- Salt를 추가하여 같은 비밀번호라도 서로 다른 해시값 생성
- 실제 서비스에선 bcrypt, scrypt 등 더 강력한 해시 알고리즘 사용 고려
📎 참고 링크
728x90
반응형
'Dev etc > etc' 카테고리의 다른 글
| 🐳 Docker 설치 오류 해결 – WSL 관련 오류 코드: hcs_e_service_not_available (3) | 2025.07.04 |
|---|---|
| 📌 개발 방법론 종류와 특징 정리 (프로젝트 성격별 추천 포함) (0) | 2025.06.04 |
| [Web-dev] URL 인코딩(Encoding)이란? 기본원리 및 사용 예제 (0) | 2024.06.12 |
| [OCR] Tesseract OCR 설치 및 사용방법 (0) | 2024.01.05 |
| [C++] 콘솔환경에서 글자색,배경색 색상 변경 (0) | 2023.09.21 |
댓글