为什么这些不一样?
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;
}
答案 0 :(得分:10)
C#输出base64 ecoded字符串,PHP输出十六进制数字。更好的比较可能是将参数true传递给PHP的哈希函数的末尾,并将结果传递给base64:
$hash = base64_encode(
hash('sha256', $userData['salt'] . hash('sha256', $password), true )
);
答案 1 :(得分:3)
因为他们不同。您的C#代码在最后以Base64编码对计算的哈希进行编码。 PHP只返回一个十六进制数字字符串。
答案 2 :(得分:2)
首先怀疑:
Encoding.UTF8.GetBytes(plainText);
C#使用UTF-8,你的PHP可能没有,但如果你使用来自US-ASCII子集的严格字母,你可能会很幸运。
第二个嫌疑人:
Convert.ToBase64String(tHashBytes);
你的PHP中没有关于Base64的内容。
由于PHP会给你一个十六进制编码的结果,你也应该在C#中切换到Hex。有关解决方案,请参阅this answer。
答案 3 :(得分:0)
嗯,我不是C#程序员,但有一件事就是这样:
// Convert result into a base64-encoded string.
string hashValue = Convert.ToBase64String(tHashBytes);
您是否在C#中使用64位编码最终输出?因为你不在PHP ......
答案 4 :(得分:-1)
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));
像顶级代码一样写,它们是相同的
答案 5 :(得分:-1)
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));
为我工作。