pbkdf 2-sha 512密码输入使用了什么python代码?

hts6caw3  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(193)

我在密码文件中有以下散列条目:

$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(),我的问题就可以解决了。

2ledvvac

2ledvvac1#

只是在阅读文档,但看起来:
不建议将PasswordHash.setting_kwds(如rounds和salt_size)直接传递到hash()方法中。调用者应该改为使用handler.using(**settings).hash(secret)。对旧方法的支持暂时计划在Passlib 2.0中删除。
因此,您可能应该切换到使用'using()'范例。你的代码应该可以工作。
我可以看到两个明显的问题来源。字符串密码的编码(Unicode/UTF-8(/ASCII)),文档在这一点上并不完全清楚,这取决于它在源系统上是如何完成的。第二种可能性是原始系统使用了big-endian编码。

相关问题