【发布时间】:2017-06-11 02:57:39
【问题描述】:
我会直接回答这个问题,
我们有这段 C# 代码
using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, passwordSaltBytes, iterationCount))
{
pbkdf2Bytes = pbkdf2.GetBytes(derivedLength + iterationCountBytes.Length);
}
返回一个字节数组,第一个索引的值为252
我们在 PHP 中尝试同样的事情:
$key = hash_pbkdf2("SHA1", $password, $password.$salt, $iterationCount, 48);
第一个索引是 102...
在这个特定部分之前的值都匹配。
只是那个散列函数没有给我一致的结果。
感谢您的帮助,干杯。
编辑 - 如果不是很明显,我试图理解为什么这两个值不匹配,我误解了什么编码/解码等等。
【问题讨论】:
-
pbkdf1 包括 sha1(向后兼容性),而 pbkdf2 不包括。请参阅:rfc-base.org/txt/rfc-2898.txt。另见发帖:stackoverflow.com/questions/8068133/…
-
我昨天回答了一个可疑的熟悉问题。如果您阅读
hash_pbkdf2的文档,您会注意到的第一件事是它输出十六进制而不是原始数据,除非您将$raw_output设置为true。你得到 102 的原因是因为 102 被编码为 ASCII/UTF8 中的字符 f。见这里:php.net/manual/en/function.hash-pbkdf2.php -
@BarryD。为什么是
$password.$salt而不是$salt? -
@LukePark 和你来来回回的人不是 OP。但是我们知道您已经厌倦了帮助并删除了您的评论,不知道您为什么要在这里发帖-顺便说一句,您也可以随意删除这些 cmets。
-
@ArtjomB。因为 C# 脚本将两者结合起来并将其作为
passwordSaltBytes传递,在分析这些字节时,当我执行 $password.$salt 然后读取它们的字节时,我在 PHP 中得到相同的结果。
标签: c# php encryption rfc