SHA256 не дает тот же результат между C # и SQL Server при использовании испанских слов - PullRequest
0 голосов
/ 11 июля 2019

Я использую SHA256, чтобы получить хешированную шестнадцатеричную строку. Он работает нормально при использовании обычных символов, однако, когда строка, которую нужно хэшировать, содержит акценты / диакритические знаки, тогда я получаю другой результат в C # и T-SQL. Я бы предпочел внести изменения в конце SQL Server.

  • Пример слова, которое соответствует: птица
  • Пример слова, которое не соответствует: MUÑOZ

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) 

1 Ответ

4 голосов
/ 11 июля 2019

.NET, Windows и SQL Server используют UTF16, а не UTF8.Два фрагмента хэшируют разные байты.Когда используется такая же кодировка, строки хеша идентичны.

This:

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 Server

...