PHP - C#翻译哈希功能不起作用?

时间:2017-06-10 01:53:51

标签: c# php encryption rfc

我会正确回答这个问题,

我们有这个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 ......

这些值在此特定部分之前都匹配。

只是哈希函数没有给我一致的结果。

欢迎任何帮助,欢呼。

编辑 - 如果不明显,我正在尝试理解为什么这两个值不匹配,编码/解码等等我误解或做错了。

1 个答案:

答案 0 :(得分:0)

这是完整的C#代码。正如你所看到的那样,有一些不必要的循环等,但其原因并非如此:

  1. 正如有人所指出的那样,PHP中的字节默认不输出原始数据,因此其字节的哈希(因此也就是其字节)与C#脚本的字节不完全相同。
  2. 以前,我认为(正如其他人也指出的那样)我应该传递$salt,因为它没有任何编码或转换。但仔细观察实际的C#代码......我们可以在第二个for i循环中看到他们实际上将saltBytes附加到passwordBytes上,从而创建类似于$password.$salt的内容PHP中的{1}}
  3. 结合上述两个问题:

    • 发送$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);
      
      
          }
      

    感谢。