
本文旨在指导开发者如何使用Python安全地哈希密码并存储到数据库中。我们将讨论如何使用`secrets`模块生成安全的随机盐,以及如何在哈希密码时正确处理盐。同时,强调避免“自己实现加密算法”,并推荐使用成熟的密码哈希库。
密码安全是Web应用开发中至关重要的一环。不安全的密码存储方式很容易导致数据泄露,给用户带来极大的风险。本文将介绍如何使用Python安全地哈希密码,并提供一些关于如何安全存储密码的建议。
在密码哈希过程中,盐(Salt)是一个随机生成的数据,与密码组合后再进行哈希。盐的作用是防止彩虹表攻击。os.urandom可以生成随机数据,但在密码学应用中,更推荐使用 secrets 模块,因为它更适合生成密码学安全的随机数。
import secrets
import hashlib
def hash_password(password):
    salt = secrets.token_hex(16) # 生成16字节的随机盐
    hashed_password = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt.encode('utf-8'), iterations=100000)
    return salt, hashed_password.hex()
password = input("Create Password: ")
salt, hashed = hash_password(password)
print(f"Salt: {salt}")
print(f"Hashed Password: {hashed}")代码解释:
立即学习“Python免费学习笔记(深入)”;
哈希后的密码和盐都需要存储在数据库中。非常重要的一点是,盐必须与哈希后的密码一起存储,以便在验证密码时使用相同的盐。
一个常见的数据库表结构如下:
| 列名 | 数据类型 | 描述 | 
|---|---|---|
| user_id | INTEGER | 用户ID(主键) | 
| username | VARCHAR | 用户名 | 
| password_hash | VARCHAR | 哈希后的密码 | 
| salt | VARCHAR | 盐 | 
在将数据插入数据库时,需要分别存储盐和哈希后的密码。
验证密码时,需要从数据库中检索盐和哈希后的密码,然后使用相同的盐和哈希算法对用户输入的密码进行哈希,并与数据库中存储的哈希值进行比较。
import hashlib
def verify_password(password, stored_salt, stored_hash):
    hashed_password = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), stored_salt.encode('utf-8'), iterations=100000)
    return hashed_password.hex() == stored_hash
# 假设从数据库中获取了 salt 和 hashed_password
stored_salt = "your_stored_salt"
stored_hash = "your_stored_hash"
password_to_verify = input("Enter password to verify: ")
if verify_password(password_to_verify, stored_salt, stored_hash):
    print("Password verified!")
else:
    print("Incorrect password.")代码解释:
立即学习“Python免费学习笔记(深入)”;
密码学是一个非常复杂的领域,很容易犯错。强烈建议不要自己实现密码哈希算法。 应该使用经过良好测试和审查的库,例如 bcrypt 或 argon2。 这些库通常提供更高级的功能,例如自动盐生成和迭代次数调整,并且更不容易受到攻击。
示例 (使用 bcrypt):
首先,需要安装 bcrypt 库: pip install bcrypt
import bcrypt
def hash_password(password):
    hashed = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
    return hashed.decode('utf-8')
def verify_password(password, stored_hash):
    return bcrypt.checkpw(password.encode('utf-8'), stored_hash.encode('utf-8'))
password = input("Create Password: ")
hashed_password = hash_password(password)
print(f"Hashed Password: {hashed_password}")
password_to_verify = input("Enter password to verify: ")
if verify_password(password_to_verify, hashed_password):
    print("Password verified!")
else:
    print("Incorrect password.")bcrypt 库会自动处理盐的生成和存储,并且提供了方便的 checkpw 函数来验证密码。
密码安全是Web应用开发中的关键环节。通过使用 secrets 模块生成安全的随机盐,并使用 PBKDF2 或 bcrypt 等成熟的密码哈希库,可以大大提高密码的安全性。 务必记住,盐必须与哈希后的密码一起存储,以便在验证密码时使用。 并且,永远不要自己实现加密算法,使用经过良好测试和审查的库。
以上就是安全密码哈希与存储:Python教程的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号