16

为什么这些不一样?

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;
    }
4

6 回答 6

11

C# 输出 base64 编码字符串,PHP 输出十六进制数字。更好的比较可能是将参数 true 传递到 PHP 的散列函数的末尾,然后 base64 得到结果:

 $hash = base64_encode(
           hash('sha256', $userData['salt'] . hash('sha256', $password), true )
         );
于 2011-08-30T21:30:25.107 回答
3

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

于 2011-08-30T21:29:21.937 回答
2

第一个嫌疑人:

Encoding.UTF8.GetBytes(plainText);

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

第二个嫌疑人:

Convert.ToBase64String(tHashBytes);

您的 PHP 中没有关于 Base64 的内容。

由于 PHP 会给你一个十六进制编码的结果,你也应该在你的 C# 中切换到十六进制。有关解决方案,请参阅此答案

于 2011-08-30T21:31:23.467 回答
0

好吧,我不是 C# 程序员,但让我印象深刻的一件事是:

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

您是否在 C# 中对最终输出进行 base64 编码?因为你不在PHP中......

于 2011-08-30T21:30:49.233 回答
-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));

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

于 2013-03-01T09:43:27.867 回答
-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));

为我工作。

于 2020-02-16T13:56:55.920 回答