我会正确回答这个问题,
我们有这个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 ......
这些值在此特定部分之前都匹配。
只是哈希函数没有给我一致的结果。
欢迎任何帮助,欢呼。
编辑 - 如果不明显,我正在尝试理解为什么这两个值不匹配,编码/解码等等我误解或做错了。
答案 0 :(得分:0)
这是完整的C#代码。正如你所看到的那样,有一些不必要的循环等,但其原因并非如此:
$salt
,因为它没有任何编码或转换。但仔细观察实际的C#代码......我们可以在第二个for i
循环中看到他们实际上将saltBytes
附加到passwordBytes
上,从而创建类似于$password.$salt
的内容PHP中的{1}} 结合上述两个问题:
发送$password.$salt
而不只是一个,然后将$raw_output
选项设置为true,输出相同的哈希值,与C#相同的字节。
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
byte[] iterationCountBytes = BitConverter.GetBytes(iterationCount);
int derivedLength = passwordBytes.Length + saltBytes.Length;
byte[] passwordSaltBytes = new byte[derivedLength];
byte[] pbkdf2Bytes;
string encryptedString;
for (int i = 0; i < passwordBytes.Length; i++)
{
passwordSaltBytes[i] = passwordBytes[i];
}
for (int i = 0; i < saltBytes.Length; i++)
{
passwordSaltBytes[passwordBytes.Length + i] = saltBytes[i];
}
using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, passwordSaltBytes, iterationCount))
{
pbkdf2Bytes = pbkdf2.GetBytes(derivedLength + iterationCountBytes.Length);
}
感谢。