솔트와 해싱을 활용한 안전한 비밀번호 저장 방법
비밀번호 보안은 온라인 사용자들에게 매우 중요한 문제입니다. 일반적으로 사용자의 비밀번호는 해시 함수를 통해 저장됩니다. 하지만 해시 함수만을 사용하면 비밀번호를 추측할 수 있는 공격에 취약해질 수 있습니다. 이러한 공격을 막기 위해 솔트와 해싱을 함께 사용하는 것이 좋은 방법입니다.
솔트(Salt)
솔트는 비밀번호를 해싱하기 전에 임의의 문자열을 추가하는 과정입니다. 솔트를 사용하면 같은 비밀번호를 가진 사용자도 다른 해시값을 가지게 되어 공격자가 일일이 모든 해시값을 비교하여 비밀번호를 찾아내는 것을 어렵게 만듭니다.
비밀번호를 저장할 때 각 사용자마다 고유한 솔트 값을 생성하여 저장하면 됩니다. 솔트는 가능한한 무작위성이 높아야 하며, 변하지 않는 고유한 값을 사용하는 것이 좋습니다.
해싱(Hashing)
해싱은 비밀번호를 변환하여 저장하는 과정입니다. 해싱 함수는 입력된 값을 고정된 길이의 값으로 변환합니다. 해시 함수는 일방향 함수이므로 비밀번호를 추출하기 어렵게 만들어줍니다.
즉, 비밀번호를 해싱하여 저장하면 저장된 해시값만으로는 원래 비밀번호를 복원할 수 없기 때문에 보안성이 더욱 향상됩니다.
솔트와 해싱을 함께 사용한 비밀번호 저장 방법
- 사용자가 비밀번호를 입력하면, 고유한 솔트 값을 생성합니다.
- 비밀번호와 솔트 값을 함께 해싱 함수에 입력하여 해시값을 생성합니다.
- 생성된 해시값과 솔트 값을 함께 저장합니다.
- 사용자가 비밀번호를 입력할 때마다 동일한 솔트 값을 사용하여 해싱하고 저장된 해시값과 비교합니다.
암호화된 해시값은 원래 비밀번호를 찾는 데 사용할 수 없으므로 안전하게 비밀번호를 저장할 수 있습니다.
예시 코드
import hashlib
import os
def generate_salt(length=16):
return os.urandom(length)
def hash_password(password, salt):
salted_password = password + salt
hashed_password = hashlib.sha256(salted_password.encode()).hexdigest()
return hashed_password
# 사용자 비밀번호 저장
def save_password(password):
salt = generate_salt()
hashed_password = hash_password(password, salt)
# 해시값과 솔트 값을 저장
# 사용자 비밀번호 인증
def authenticate_password(password):
# 저장된 해시값과 솔트 값을 가져옴
stored_hash = ...
stored_salt = ...
hashed_password = hash_password(password, stored_salt)
# 해시값 비교
if hashed_password == stored_hash:
# 로그인 성공
else:
# 로그인 실패