MD5 хеширование в SQL Server - PullRequest
1 голос
/ 10 июня 2019

Функция хеширования SQL MD5 возвращает другой результат другим, например, passwordsgenerator.net/md5-hash-generator

Прежде всего, я выбираю исходную строку случайным образом, которая в данном случае:

спасибо(:

Предоставление генератору MD5 салатного чуда с исходной строкой вернуло следующий результат:

e1295bb206823340c694b795c17eb4c5

Запрос, который я использовал для создания хэша MD5 в SQL Server, выглядит следующим образом:

SELECT CONVERT(VARCHAR(32), HASHBYTES('md5', 'спасибо(:'), 2)

... который дал следующий результат:

C4E6F99E8CD676020DC7D3E13612D51A

Пожалуйста, кто-нибудь может помочь мне выяснить а) почему они разные и б) запрос Sql, который вернет тот же результат, что и генератор паролей.net?

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Пояснения

Одним из возможных объяснений является то, что этот онлайн-инструмент вычисляет хэш MD5 кодированной строки UTF8.Я могу воспроизвести это поведение с PHP и T-SQL.

Возможные решения:

  • преобразовать ваш UTF-8 текст в cyrillic текст в вашем приложении и после этого использовать HASHBYTES

  • кодировать ваш cyrillic текст в UTF-8 в базе данных, используя такие функции, как ToUTF .Я использую эту функцию только для теста, но предлагаю сделать преобразование в вашем приложении.

Тестирование с использованием PHP и преобразование из UTF8 в CP1251

PHP:

<?php
$input = "спасибо(:";
$input = iconv("UTF8", "CP1251", $input);
echo md5($input);
?>

T-SQL:

DECLARE @input varchar(32) = 'спасибо(:'
SELECT CONVERT(varchar(32), HASHBYTES('md5', @input), 2)

Вывод:

C4E6F99E8CD676020DC7D3E13612D51A

Тестирование с использованием онлайн-генератора и UDF

T-SQL:

DECLARE @input varchar(32) = 'спасибо(:'
SELECT CONVERT(VARCHAR(32), HASHBYTES('md5', dbo.ToUTF8(@input)), 2)

Вывод:

E1295BB206823340C694B795C17EB4C5

Примечания

Сортировка по умолчанию для тестовой базы данныхCyrillic_General_CS_AS.

1 голос
/ 10 июня 2019

Выходные данные этого

select CONVERT(NVARCHAR(64),HASHBYTES('md5','спасибо(:'),2), HASHBYTES('md5','спасибо(:')

равны

6010E112D213366938E6C894F1BE9C2A                                 0x6010E112D213366938E6C894F1BE9C2A

, поэтому выходные данные функции включают «0x», см. Как получить SQL Server md5хеш, соответствующий предыдущему хэшу php md5?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...