加入我与弱密码哈希的斗争。是否有使用PBKDF2作为密码哈希的标准?
PBKDF2密码散列应包含salt,迭代次数和散列本身,以便稍后进行验证。是否有标准格式,例如RFC2307的{SSHA},用于PBKDF2密码哈希值? BCRYPT很棒,但PBKDF2更容易实现。
显然,没有规范。所以这是我的规格。
>>> from base64 import urlsafe_b64encode
>>> password = u"hashy the \N{SNOWMAN}"
>>> salt = urlsafe_b64decode('s8MHhEQ78sM=')
>>> encoded = pbkdf2_hash(password, salt=salt)
>>> encoded
'{PBKDF2}1000$s8MHhEQ78sM=$hcKhCiW13OVhmLrbagdY-RwJvkA='
更新:http://www.dlitz.net/software/python-pbkdf2/定义crypt()
更换。我更新了我的小规格以匹配他,除了他以$p5k2$
开头,而不是{PBKDF2}
。 (我需要迁移其他LDAP风格的{SCHEMES})。
这是{PBKDF2}
,在小写十六进制,$
迭代次数,则urlsafe_base64
编码盐,$
和urlsafe_base64
编码PBKDF2输出。 salt应该是64位,迭代次数应该至少为1000,并且HMAC-SHA1输出的PBKDF2可以是任何长度。在我的实现中,默认情况下总是20个字节(SHA-1哈希的长度)。
在通过PBKDF2发送密码之前,必须将密码编码为utf-8。没有关于是否应将其规范化为Unicode的NFC。
这个方案应该比次更加昂贵,因为蛮力比{SSHA}要贵。
我写了这段代码之后的一段时间,我意识到RedHat Linux中使用的基于SHA的隐藏替换。它可能比有问题的PBKDF2方案设计得更好。 http://en.wikipedia.org/wiki/Crypt_%28Unix%29#SHA-based_scheme – joeforker 2010-08-31 19:40:43