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

2022-08-31 01:14:59

为什么这些不一样?

断续器:

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

答案 1

C# 输出一个 base64 生态字符串,PHP 输出一个十六进制数字。更好的比较可能是将参数 true 传递到 PHP 的哈希函数的末尾,并将结果 base64 传递到以下结果:

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

答案 2

因为它们是不同的。C# 代码在末尾以 Base64 编码对计算的哈希进行编码。PHP只返回一个十六进制数字的字符串。


推荐