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, прежде чем вычислять хеш в другом месте (с пониманием, что вы потеряете некоторую точность).