我在密码文件中有以下散列条目:
$pbkdf2-sha512$25000$K0XonfPe29vbW0up9X5vDQ$3scRqpOxF29.tqPWpKJmcFvpb8/SFtbAiI2UlrM473B3tD.Mw8xzamNaE0KpZApTc7N1stlK/vvdUl9xna6wIA
现在,我知道用于生成此条目的密码是“foobar”。根据这个URL,我还知道以下内容:
*pbkdf 2-sha 512标识用于生成哈希的加密哈希。
*25000表示执行的迭代。
*K 0XonfPe 29 vbW 0 up 9 X5 vDQ是传入PBKDF 2函数的原始盐字节的适配base64编码
*3scRqpOxF29.tqPWpKJmcFvpb8/SFtbAiI2UlrM473B3tD.Mw8xzamNaE0KpZApTc7N1stlK/vvdUl 9 xna 6 wIA是从PBKDF 2函数返回的原始派生密钥字节
因此,我的代码如下所示:
from passlib.utils.binary import ab64_decode
from passlib.hash import pbkdf2_sha512
salt = 'K0XonfPe29vbW0up9X5vDQ'
salt_decoded = ab64_decode(salt)
hashed_string = pbkdf2_sha512.hash('foobar', rounds=25000, salt=salt_decoded)
我的问题是:我希望 hashed_string 总是返回相同的值 * 和 * 来匹配密码文件条目。但是,我总是得到以下 hashed_string 的值:
$pbkdf2-sha512$25000$K0XonfPe29vbW0up9X5vDQ$ekYyFII.tyf0kWX1BBkICleOTCWIjDbKtGQ4iAU/qvGSmWQf.SAcFcJu6ZGwFFQMe4Kws2ngw.pgGaVe7F/I2g
我哪里做错了?
我尝试了各种编码和解码值的组合,但都没有成功。我猜想,如果我知道从密码文件中的条目正确地导出salt,并且/或者知道如何正确地调用pbkdf2_sha512.hash()
,我的问题就可以解决了。
1条答案
按热度按时间2ledvvac1#
只是在阅读文档,但看起来:
不建议将PasswordHash.setting_kwds(如rounds和salt_size)直接传递到hash()方法中。调用者应该改为使用handler.using(**settings).hash(secret)。对旧方法的支持暂时计划在Passlib 2.0中删除。
因此,您可能应该切换到使用'using()'范例。你的代码应该可以工作。
我可以看到两个明显的问题来源。字符串密码的编码(Unicode/UTF-8(/ASCII)),文档在这一点上并不完全清楚,这取决于它在源系统上是如何完成的。第二种可能性是原始系统使用了big-endian编码。