很难比较哈希值

时间:2018-08-21 16:35:02

标签: php cryptography sha1 hmac pbkdf2

我正在将用户从一个环境迁移到另一个环境,我们需要在此新环境上验证用户密码。我试图使用户不必重设密码。

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

问题是,当前的哈希是使用带有HMAC-SHA1算法的pbkdf2完成的,运行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==

我不明白自己在做什么错。

1 个答案:

答案 0 :(得分:1)

不确定为什么,但是您提供的网站和hash_pbkdf2()的行为却不同:

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

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

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