我使用generate_password_hash
中的werkzeug.security
对我的密码进行哈希处理。我最近看到了this article about SHA-1 collisions。 werkzeug.security
使用SHA-1,因为它不再安全,我想要一个替代方案。如何在不依赖SHA-1的情况下散列我的密码?
from werkzeug.security import generate_password_hash
generate_password_hash(secret)
答案 0 :(得分:16)
在generate_password_hash
中使用SHA-1不容易受到攻击,因为它仅用作PBKDF2哈希中的中间迭代步骤。 See the discussion in chat.
当您在PBKDF2中链接数以万亿计的哈希时,风险与通过纯粹机会破坏强密码的人无法区分。
有关cryptography-dev邮件列表的进一步讨论。
与SHA-1一起使用时,HMAC的安全性仍然正常,这是正确的, 相信与否,HMAC-MD5甚至是安全的。
generate_password_hash
使用method
参数来自定义哈希的生成方式。默认值为pbkdf2:sha1
。为PBKDF2传递不同的推导方法。
generate_password_hash(secret, method='pbkdf2:sha512')
您还可以将迭代次数从默认值150,000更改为更高的数字,代价是较慢的哈希速度。 pbkdf2:sha1:200000
。
您可能对PBKDF2没问题,只要哈希和迭代调整得很好。或者,使用Passlib,它支持比Werkzeug更多的哈希方法。有关要使用哪些哈希值的讨论,请参阅Passlib的recommended hashes。此示例显示如何将bcrypt与Passlib一起使用。
pip install passlib bcrypt
from passlib.context import CryptContext
crypt_context = CryptContext(schemes=['bcrypt_sha256'])
crypt_context.hash(secret)