2014-09-19 50 views
5

在阅读了一些有关盐渍密码的信息之后,似乎最好为每个用户使用一种独特的盐。我正在实施Flask-Security atm,并且从文档中看到,您只能设置全局盐:即SECURITY_PASSWORD_SALT ='thesalt'每位用户使用Flask-Security的独特盐

问题:如何为每个密码创建独特的salt?

谢谢!

编辑:来自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. 
+1

一个全球性的盐不是盐。如果每个人都使用相同的盐,那么恰好具有相同密码的两个用户将具有相同的哈希密码。这就是盐类预防的一种情况。 – 2014-09-19 20:45:39

+0

@MichaelBurr好的,这就是我想的......这就是为什么我很困惑。如何使用此设置为每个密码创建独特的盐?或者我必须重写Flask-Security中内置的salting以执行此操作? – Chockomonkey 2014-09-19 21:30:36

+1

对不起 - 我对Flask一无所知。我只是在评论全球盐的想法。 – 2014-09-19 21:54:07

回答

12

是,瓶,安全性也通过设计,如果使用bcrypt(和其他方案,如des_crypt,pbkdf2_sha256每个用户都盐, pbkdf2_sha512,sha256_crypt,sha512_crypt)。

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

它可以在代码进行验证,从加密步行到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

注意,每个呼叫进行加密()产生新的盐,

5

原来,如果您使用bcrypt,它会负责腌制并将其存储在散列中。所以我会走这条路!

由于这个话题这导致我这一发现:

Do I need to store the salt with bcrypt?

+2

找到解决方案后回到自己的问题的荣誉。 – 2014-09-21 02:08:59