当前位置: 首页 > 知识库问答 >
问题:

密码哈希。java未生成匹配的PBKDF2-HMAC-SHA1哈希

鲍鸿波
2023-03-14

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

例如,下面是密码“测试”的条目:1000:f7fe4d511bcd33321747a778dd21097f4c0ff98f1e0eba39:b69139f51bc4098afc36b4ff804291b0bc697f87be9c1ced

在这里,我们可以通过拆分字符串并找到:

迭代次数:1000

盐:f7fe4d511bcd33321747a778dd21097f4c0ff98f1e0eba39

PBKDF2哈希:b69139f51bc4098afc36b4ff804291b0bc697f87be9c1ced

我修改了Django的check_密码机制以与此格式兼容,但发现它认为密码不正确。我用了Django的密码。py使用与Play使用的盐相同的盐为“test”重新生成哈希,并得出以下结论:

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

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

在我无法使Django生成的哈希与Java的哈希匹配后,我在一个为你做这件事的网站上尝试了一下。

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

我不确定PasswordHash是怎么回事。java,但我迫切需要得到Django和发挥“发挥得很好”(无法控制自己哈哈)。有人知道这里发生了什么吗?

共有1个答案

平航
2023-03-14

试试salt=base64。B16解码(salt.upper())。

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

说明:

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

之所以使用upper(),是因为python的b16decode对大写Base16有严格要求。如果你给它小写的,它会出错。

 类似资料:
  • 问题内容: 我想创建一个(用键签名)的哈希 如何使用Node.js Crypto创建该哈希? 问题答案: 加密文档:http : //nodejs.org/api/crypto.html

  • 我一直在研究散列/加密密码并将其存储在数据库中的正确方法。我知道盐和散列,所以我环顾四周,PBKDF2似乎是一个不错的选择。所以我找到了这个网站,它提供了一个很好的教程,以及一个适用于PHP的PBKDF2(这是我在我的网站上使用的)。 因此,我设置了我的网站,以使用这些功能生成/创建密码,但正如您在以下代码中看到的: salt在create_散列函数中生成,并存储在生成的散列中,该散列最终看起来像

  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 问题内容: 我对加密/哈希知之甚少。 我必须对加密密钥进行哈希处理。Java中的示例是这样的… 现在,如果我错了,请纠正我,但是上面的代码使用MD5算法对字符串进行了哈希处理。 当我在C#中哈希相同的字符串时,我希望得到相同的结果。 我当前的C#代码看起来像这样… 但是末字节结果不匹配。 Java得到… C#得到… 我需要C#代码才能获得与Java代码相同的结果(不是相反),有什么想法吗? 谢谢。

  • 我是相对较新的PHP,刚刚开始掌握盐的点,当谈到散列密码(我想?)。不管怎样,这是我的问题... 现在我有一个mysql数据库,用户名,密码,盐字段。密码字段长度为64个字符,盐字段为3个字符。在注册时,每个用户名被分配一个随机的盐。我对此没有任何问题(我相信)。首先,通过以下方式散列用户所需的密码: 然后,通过以下过程将用户所需的密码与pbkdf2中包含的盐进行散列,并将其输入数据库: 我的问题

  • 我使用mitsuhiko的pbkdf2实现进行密码哈希: 此函数返回二进制摘要,然后将其编码在bas64中并保存到数据库中。此外,当用户登录时,Base64字符串被设置为cookie。 此函数用于密码哈希比较: 我想知道在安全性方面,二进制哈希和Base64字符串的比较是否有任何不同?例如,当用户登录时,我会计算提交密码的二进制摘要,从数据库中解码Base64字符串,然后比较两个二进制哈希,但是如