SQL Server: хешбайты с умлаутами

У меня странная ситуация разобралась, когда Hashbyte Функция SQL Server не выводит правильный результат при преобразовании его в SHA2_256 со строкой, содержащей умлауты (ä,ö,ü,ß).

Я запускаю пример кода в SQL Server:

 declare @cryptString varchar(50) 
 set @cryptString = 'test'

 select convert(Varchar(64), Hashbytes('SHA2_256', @cryptstring), 2)

Результат:

9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08

Когда я проверяю преобразование SHA256 на https://hashgenerator.de/ результат тот же.

Моя проблема: когда я пытаюсь зашифровать, например, 'müller', результат в SQL Server:

26A45113433596C5DD53643C7652381202E8009E532A280E513D887174A9ED14

Когда я проверяю преобразование SHA256 на https://hashgenerator.de/ результат отличается.

2dbd218072117713f2d5996a726a9b216ed791ffd0783b6ba4ab6d61b8333192

Я думаю, что это может быть проблема кодирования, но я искал часы и не могу найти какой-либо ключ, чтобы решить эту проблему.

Я ценю любую помощь, чтобы решить эту проблему.

1 ответ

Решение

У вас есть это:

declare @cryptString varchar(50) 

И вы пытаетесь использовать его для хранения этого значения:

müller

Это плохо. Вам нужен nvarchar за все, что может выходить за рамки базовых символов ascii.

Но это только для начала. nvarchar использует UTF-16 (см. раздел "Дополнительные символы" примерно на полпути вниз по странице). Веб-сайт может использовать UTF-32 или (вероятно) UTF-8 для кодирования этих символов. Любой из них будет использовать слегка отличающиеся представления байтов, которые приведут к совершенно другим значениям хеш-функции.

Я полагаю, что вы видите UTF-8 по адресу https://hashgenerator.de/, потому что UTF-8 соответствует ASCII, когда используются только символы ASCII. С UTF-8 простые значения, такие как test будет производить одинаковый результат как для веб-сайта, так и для базы данных.

Чтобы это исправить, поймите, что хеш-код SQL будет использовать ASCII или UTF-16, и поэтому вы должны изменить кодировку на любой другой платформе, которую вы используете для соответствия базе данных. Самый простой вариант, вероятно, всегда использовать UTF-16 для этих значений, но вы также можете придерживаться varchar в базе данных и конвертируйте свой текст в ascii, прежде чем вычислять хеш в другом месте (с пониманием, что вы потеряете некоторую точность).

Другие вопросы по тегам