繁体   English   中英

PasswordHash.java无法生成匹配的PBKDF2-HMAC-SHA1哈希

[英]PasswordHash.java not generating matching PBKDF2-HMAC-SHA1 hash

我正在编写需要与现有Java Play框架应用程序一起使用的Django应用程序。 Play应用程序使用PasswordHash.java来存储密码。 它以冒号分隔的格式存储密码。 每个哈希存储为iterationssaltpbkdf2_hash

例如,这是密码“ test”的条目: 1000:f7fe4d511bcd33321747a778dd21097f4c0ff98f1e0eba39:b69139f51bc4098afc36b4ff804291b0bc697f87be9c1ced

在这里,我们可以用:分割字符串,然后找到:

迭代次数: 1000

盐: f7fe4d511bcd33321747a778dd21097f4c0ff98f1e0eba39

PBKDF2哈希: b69139f51bc4098afc36b4ff804291b0bc697f87be9c1ced

我修改了Django的check_password机制以使其与此格式兼容,但是发现它认为密码不正确。 我使用Django的crypto.py使用Play所用的相同盐重新生成了“测试”的哈希,并提出了以下方案:

hash = crypto.pbkdf2('test', 'f7fe4d511bcd33321747a778dd21097f4c0ff98f1e0eba39', 1000, 24)
base64.b16encode(hash)
'9A8725BA1025803028ED5B92748DD61DFC2625CC39E45B91'

播放中的PBKDF2哈希与该哈希不匹配。 (对于那些想知道的人,我使用24作为第四个参数,因为那是在PasswordHash.java中使用的东西)。

当我无法使Django生成的哈希与Java匹配时,我在为您提供此功能的网站上对其进行了尝试

我插入了相同的符号,使用具有1000次迭代和24位密钥大小的SHA-1,发现该网站与Django创建的内容匹配!

我不确定PasswordHash.java是怎么回事,但我迫切需要让Django和Play播放“很好地播放”(无法帮助自己哈哈)。 有谁知道这里发生的事情吗?

尝试salt = base64.b16decode(salt.upper())

我做到了,并且在您的初始示例中得到了哈希值,尽管大写的B69139F5...

说明:

在初始示例中,哈希和盐值都存储在Base16(十六进制)中。 因此,您可以对盐进行解码以使用它,然后对生成的哈希进行编码,以将其与存储的哈希进行比较。

upper()是因为python的b16decode对大写的Base16严格要求。 如果给它小写字母,它将出错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM