使用 Salt + Hash 将密码加密后再存储进数据库


在Python中,你可以使用内置的`hashlib`库结合盐值(salt)来对密码进行加密。盐值是一个随机字符串,用于与密码一起散列,以确保即使两个用户拥有相同的密码,它们的散列值也是不同的。以下是一个简单的例子,展示了如何使用`hashlib`和`os`库来生成盐值,并将密码与盐值一起散列后存储。


import hashlib
import os
from typing import Tuple

def generate_salt(length: int = 16) -> str:
    """生成一个随机盐值"""
    return os.urandom(length).hex()

def hash_password(password: str, salt: str) -> str:
    """使用SHA-256算法和盐值对密码进行散列"""
    hash_object = hashlib.sha256((salt + password).encode('utf-8'))
    return hash_object.hexdigest()

def store_password(password: str) -> Tuple[str, str]:
    """生成盐值,散列密码,并返回盐值和散列值"""
    salt = generate_salt()
    hashed_password = hash_password(password, salt)
    return salt, hashed_password

# 示例用法
password = "userpassword123"
salt, hashed_password = store_password(password)

print(f"Salt: {salt}")
print(f"Hashed Password: {hashed_password}")

# 在实际应用中,你会将salt和hashed_password存储到数据库中
# 记住,为了验证密码,你需要同时存储盐值和散列值

请注意,这个例子中使用了`SHA-256`算法,这是目前广泛使用且被认为是相对安全的算法之一。然而,在选择加密算法时,请根据你的具体需求和安全要求来决定。

此外,存储密码时,请确保你的数据库连接和查询是安全的,以防止敏感信息泄露。在Web应用程序中,使用HTTPS来加密客户端和服务器之间的通信也是非常重要的。