7

在这里阅读了一些关于加盐密码的内容后,似乎最好为每个用户使用唯一的盐。我正在实施 Flask-Security atm,从文档看来你只能设置一个全局盐:即 SECURITY_PASSWORD_SALT = 'thesalt'

问题:如何为每个密码制作唯一的盐?

谢谢!

编辑:从 Flask-Security 的文档中,我发现了这一点,这似乎再次表明该模块仅对所有开箱即用的密码使用单一盐。

flask_security.utils.get_hmac(password)
    Returns a Base64 encoded HMAC+SHA512 of the password signed with the salt 
    specified by SECURITY_PASSWORD_SALT.
4

2 回答 2

15

是的,如果使用 bcrypt(以及其他方案,例如 des_crypt、pbkdf2_sha256、pbkdf2_sha512、sha256_crypt、sha512_crypt),Flask-Security 确实会根据设计使用每个用户的盐。

'SECURITY_PASSWORD_SALT' 的配置仅用于 HMAC 加密。如果您使用 bcrypt 作为散列算法,Flask-Security 使用 passlib 进行散列,并在散列期间生成随机盐。问题 268 中指出了这种混淆:https ://github.com/mattupstate/flask-security/issues/268

可以在代码中验证,从 encrypt 走到 passlib:

flask_security/utils.py(第 143-151、39 和 269 行)

def encrypt_password(password):
   ...
   return _pwd_context.encrypt(signed)

_pwd_context = LocalProxy(lambda: _security.pwd_context)

flask_security/core.py(269、244-251 和 18)

pwd_context=_get_pwd_context(app)

def _get_pwd_context(app):
    ...
    return CryptContext(schemes=schemes, default=pw_hash, deprecated=deprecated)

from passlib.context import CryptContext

最后来自:https ://pythonhosted.org/passlib/password_hash_api.html#passlib.ifc.PasswordHash.encrypt

请注意,每次调用 encrypt() 都会生成一个新盐,

于 2014-12-22T05:15:13.567 回答
7

事实证明,如果您使用 bcrypt,它会处理加盐并将其与哈希一起存储。那我就走那条路吧!

多亏了这个话题,这让我有了这个发现:

我需要用 bcrypt 存储盐吗?

于 2014-09-19T23:43:41.100 回答