Dev etc/etc

[보안] 🔐 Salt값 + SHA256 암호화 이해하기

콩다영 2025. 6. 11.
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
반응형

댓글