使用西班牙语单词时,SHA256 在 C# 和 SQL 服务器之间不会产生相同的结果

SHA256 doesn't yield same result between C# and SQL Server when using Spanish words

我正在使用 SHA256 来获取经过哈希处理的十六进制字符串。它在使用常规字符时工作正常,但是当要散列的字符串包含 accents/diacritics 时,我在 C# 和 T-SQL 中得到不同的结果。我更愿意在 SQL 服务器端进行更改。

C#

using (SHA256 sha2 = SHA256.Create())  
{
    var hash = sha2.ComputeHash(Encoding.UTF8.GetBytes(fullAddress));
    string hexString = string.Empty;

    for (int i = 0; i < hash.Length; i++)
    {
        hexString += hash[i].ToString("X2"); //Convert the byte to Hexadecimal representation, Notice that we use "X2" instead of "X"
    }

    sha2.Dispose();
    return hexString;
}

SQL

declare @fullAddress nvarchar(500)
set @fullAddress = 'MUÑOZ'
select CONVERT([varchar](256), HASHBYTES('SHA2_256', @fullAddress), 2) 

.NET、Windows 和 SQL 服务器使用 UTF16,而不是 UTF8。这两个片段正在散列不同的字节。当使用 same 编码时,哈希字符串是相同的。

这个:

using (var sha2 = System.Security.Cryptography.SHA256.Create())  
{
    var hash = sha2.ComputeHash(Encoding.Unicode.GetBytes("MUÑOZ"));
    {
        string hexString = string.Empty;

        for (int i = 0; i < hash.Length; i++)
        {
            hexString += hash[i].ToString("X2");
        }
        Console.WriteLine(hexString);        
    }    
}

产生:

276DB000BF524070F106A2C413942159AB5EF2F5CA5A5B91AB2F3B6FA48EE1ED

与SQL服务器的哈希字符串相同