【问题标题】:Having a hard time comparing a hash很难比较哈希
【发布时间】:2018-08-21 16:35:01
【问题描述】:

我正在将用户从一个环境迁移到另一个环境,我们需要在这个新环境中验证用户密码。我试图让用户不必重置他们的密码。

我的计划是在登录时获取输入的密码,通过相同的过程运行它,看看我是否得到了现有的哈希值。然后我会将密码重新散列到另一个标准。

问题是,当前哈希是使用 pbkdf2 和 HMAC-SHA1 算法完成的,运行了 3000 次。

如果我输入从当前站点here 获得的信息,我会得到正确的哈希值。 如果我在 PHP 中使用 hash_pbkdf2 做同样的事情,我会得到不同的结果。

$hash = hash_pbkdf2('sha1', 'testing123', $salt, 3000, 16); // Found: cb2f9681a3bcad97
$base64 = base64_encode( $hash ); // Found: Y2IyZjk2ODFhM2JjYWQ5Nw==

对于盐,我尝试了二进制、十六进制、大写、小写、base64 解码、编码。我可能尝试了所有变体。

测试的值是:

Password: testing123
Runs: 3000
Length: 16
Salt: lg4YdsfGNm9zuRizCmk9rA==
Expected result in base64: b11fsnE0JKRaVJTS7uHDqQ==

我不明白我做错了什么。

【问题讨论】:

  • 当前环境如何?还有PHP,还是别的什么?你能展示一下哈希是如何在那里生成的吗?
  • 我在使用这些值进行测试时没有b11fsnE0JKRaVJTS7uHDqQ==

标签: php cryptography sha1 hmac pbkdf2


【解决方案1】:

不知道为什么,但您提供的网站和 hash_pbkdf2() 的行为不同:

  1. 看起来 PHP 的 hash_pbkdf2() 将密钥长度除以 2,因此您必须将其加倍才能获得相同的哈希值
  2. PHP 的hash_pbkdf2() 的结果对应网站上的Hex 字段

以下代码将为您提供与网站上相同的 base64 值(根据上述 cmets):

$hash = hash_pbkdf2('sha1',
     /* password */ 'testing123',
         /* salt */ "lg4YdsfGNm9zuRizCmk9rA==",
   /* iterations */ 3000,
/* key length *2 */ 32);
$bin = hex2bin($hash);
$base64 = base64_encode($bin);

【讨论】:

  • 我现在可以吻你了。虽然,一个小的更正是对盐进行 base64_decode。否则我会得到另一个值。感谢您指出密钥长度划分的事情。我一直在使用 16。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多