
本文旨在指导开发者如何使用Python安全地哈希密码并存储到数据库中。我们将讨论如何使用`secrets`模块生成安全的随机盐,以及如何在哈希密码时正确处理盐。同时,强调避免“自己实现加密算法”,并推荐使用成熟的密码哈希库。
密码安全是Web应用开发中至关重要的一环。不安全的密码存储方式很容易导致数据泄露,给用户带来极大的风险。本文将介绍如何使用Python安全地哈希密码,并提供一些关于如何安全存储密码的建议。
使用 secrets 模块生成安全随机盐
在密码哈希过程中,盐(Salt)是一个随机生成的数据,与密码组合后再进行哈希。盐的作用是防止彩虹表攻击。os.urandom可以生成随机数据,但在密码学应用中,更推荐使用 secrets 模块,因为它更适合生成密码学安全的随机数。
import secretsimport hashlibdef 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免费学习笔记(深入)”;
secrets.token_hex(16): 生成一个包含32个十六进制字符的随机字符串(16字节)。hashlib.pbkdf2_hmac(‘sha256’, password.encode(‘utf-8’), salt.encode(‘utf-8’), iterations=100000): 使用PBKDF2算法进行哈希。sha256: 哈希算法。password.encode(‘utf-8’): 将密码转换为字节串。salt.encode(‘utf-8’): 将盐转换为字节串。iterations=100000: 迭代次数,增加迭代次数可以提高安全性,但会增加计算成本。建议使用至少100000次迭代。
存储哈希密码和盐
哈希后的密码和盐都需要存储在数据库中。非常重要的一点是,盐必须与哈希后的密码一起存储,以便在验证密码时使用相同的盐。
一个常见的数据库表结构如下:
user_idINTEGER用户ID(主键)usernameVARCHAR用户名password_hashVARCHAR哈希后的密码saltVARCHAR盐
在将数据插入数据库时,需要分别存储盐和哈希后的密码。
密码验证
验证密码时,需要从数据库中检索盐和哈希后的密码,然后使用相同的盐和哈希算法对用户输入的密码进行哈希,并与数据库中存储的哈希值进行比较。
import hashlibdef 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_passwordstored_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免费学习笔记(深入)”;
verify_password(password, stored_salt, stored_hash): 验证密码的函数。使用从数据库中获取的stored_salt和用户输入的password,使用与哈希时相同的算法和迭代次数进行哈希。将新生成的哈希值与数据库中存储的stored_hash进行比较。
不要“自己实现加密算法”
密码学是一个非常复杂的领域,很容易犯错。强烈建议不要自己实现密码哈希算法。 应该使用经过良好测试和审查的库,例如 bcrypt 或 argon2。 这些库通常提供更高级的功能,例如自动盐生成和迭代次数调整,并且更不容易受到攻击。
示例 (使用 bcrypt):
首先,需要安装 bcrypt 库: pip install bcrypt
import bcryptdef 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教程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1377501.html
微信扫一扫
支付宝扫一扫