为什么我的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));
像顶级代码一样写,它们是一样的