很难比较哈希
Having a hard time comparing a hash
我正在将用户从一个环境迁移到另一个环境,我们需要在这个新环境中验证用户密码。我试图让用户不必重设密码。
我的计划是在登录时获取输入的密码,运行 通过相同的过程查看是否得到现有哈希值。然后我会将密码重新散列为其他标准。
问题是,当前哈希是使用 pbkdf2 和 HMAC-SHA1 算法完成的,3000 运行s。
如果我输入从当前站点获得的信息 here,我会得到正确的哈希值。
如果我在 PHP 中使用 hash_pbkdf2
做同样的事情,我会得到不同的结果。
$hash = hash_pbkdf2('sha1', 'testing123', $salt, 3000, 16); // Found: cb2f9681a3bcad97
$base64 = base64_encode( $hash ); // Found: Y2IyZjk2ODFhM2JjYWQ5Nw==
对于salt,我尝试了二进制、十六进制、大写、小写、base64解码、编码。我可能尝试了所有变体。
测试值是:
Password: testing123
Runs: 3000
Length: 16
Salt: lg4YdsfGNm9zuRizCmk9rA==
Expected result in base64: b11fsnE0JKRaVJTS7uHDqQ==
我不明白我做错了什么。
不知道为什么,但是您提供的网站和 hash_pbkdf2()
的行为不一样:
- 看起来像PHP的
hash_pbkdf2()
将密钥长度除以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);
我正在将用户从一个环境迁移到另一个环境,我们需要在这个新环境中验证用户密码。我试图让用户不必重设密码。
我的计划是在登录时获取输入的密码,运行 通过相同的过程查看是否得到现有哈希值。然后我会将密码重新散列为其他标准。
问题是,当前哈希是使用 pbkdf2 和 HMAC-SHA1 算法完成的,3000 运行s。
如果我输入从当前站点获得的信息 here,我会得到正确的哈希值。
如果我在 PHP 中使用 hash_pbkdf2
做同样的事情,我会得到不同的结果。
$hash = hash_pbkdf2('sha1', 'testing123', $salt, 3000, 16); // Found: cb2f9681a3bcad97
$base64 = base64_encode( $hash ); // Found: Y2IyZjk2ODFhM2JjYWQ5Nw==
对于salt,我尝试了二进制、十六进制、大写、小写、base64解码、编码。我可能尝试了所有变体。
测试值是:
Password: testing123
Runs: 3000
Length: 16
Salt: lg4YdsfGNm9zuRizCmk9rA==
Expected result in base64: b11fsnE0JKRaVJTS7uHDqQ==
我不明白我做错了什么。
不知道为什么,但是您提供的网站和 hash_pbkdf2()
的行为不一样:
- 看起来像PHP的
hash_pbkdf2()
将密钥长度除以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);