为什么我的PHP SHA256哈希不等同于C#SHA256Managed哈希

为什么这些不一样?

PHP:

$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) ); 

C#

  public static string ComputeHash(string plainText, string salt) { // Convert plain text into a byte array. byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); byte[] saltBytes = Encoding.UTF8.GetBytes(salt); SHA256Managed hash = new SHA256Managed(); // Compute hash value of salt. byte[] plainHash = hash.ComputeHash(plainTextBytes); byte[] concat = new byte[plainHash.Length + saltBytes.Length]; System.Buffer.BlockCopy(saltBytes, 0, concat, 0, saltBytes.Length); System.Buffer.BlockCopy(plainHash, 0, concat, saltBytes.Length, plainHash.Length); byte[] tHashBytes = hash.ComputeHash(concat); // Convert result into a base64-encoded string. string hashValue = Convert.ToBase64String(tHashBytes); // Return the result. return hashValue; } 

C#输出base64 ecoded字符串,PHP输出hex数字。 更好的比较可能是将参数true传递给PHP的散列函数的末尾,并将结果传递给base64:

  $hash = base64_encode( hash('sha256', $userData['salt'] . hash('sha256', $password), true ) ); 

因为他们不同。 您的C#代码在最后以Base64编码对计算的哈希进行编码。 PHP只返回一个hex数字字符串。

首先怀疑:

 Encoding.UTF8.GetBytes(plainText); 

C#使用UTF-8,你的PHP可能没有,但如果你使用来自US-ASCII子集的严格字母,你可能会很幸运。

第二个嫌疑人:

 Convert.ToBase64String(tHashBytes); 

你的PHP中没有关于Base64的东西。

由于PHP会给你一个hex编码的结果,你也应该在C#中切换到Hex。 请参阅此答案以获取解决方

好吧,我不是C#程序员,但有一件事突然出现在我身上:

 // Convert result into a base64-encoded string. string hashValue = Convert.ToBase64String(tHashBytes); 

你是否在C#中使用64位编码最终输出? 因为你不是PHP …

 C# string toHash = "abcdefg"; SHA256Managed hash = new SHA256Managed(); byte[] signatureData = hash.ComputeHash(new UnicodeEncoding().GetBytes(toHash)); string hashResult = System.Convert.ToBase64String(signatureData); PHP print base64_encode(hash("sha256",mb_convert_encoding("abcdefg","UTF-16LE"),true)); 

像顶级代码一样写,它们是一样的