Ответ 1
из #c с "bleepbloop": 04d3f95947702213e23730a0e8fac6c3
Тогда
select convert(varchar(32), hashbytes('MD5', 'bleepbloop'), 2)
>> 04D3F95947702213E23730A0E8FAC6C3
Или вы можете просто хранить и сравнивать как двоичные файлы.
У меня есть метод, используемый для генерации хэша:
public static string GetMD5Hash(string input)
{
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
return s.ToString();
}
Затем я сохраняю этот хеш в столбце varchar (255). Зная, что такое исходная строка ввода, можно ли было бы получить одно и то же значение хэш-функции, хранящееся в столбце varchar (255), используя sql (2005)
Я пробовал как сумасшедший, используя разные типы данных, преобразования и функцию hashbytes(), но не смог приблизиться.
Пример моей неудачной попытки: (
select convert(varchar, hashbytes('MD5', convert(varbinary(200), '<censored>',0)))
из #c с "bleepbloop": 04d3f95947702213e23730a0e8fac6c3
Тогда
select convert(varchar(32), hashbytes('MD5', 'bleepbloop'), 2)
>> 04D3F95947702213E23730A0E8FAC6C3
Или вы можете просто хранить и сравнивать как двоичные файлы.
Проблема заключается в том, что x2
получает шестнадцатеричное кодирование данных, где-as convert
получает ваш сервер, сконфигурированный для декодирования байтов (что действительно не так, поскольку эти данные не являются текстовыми, исходя из). Очень разные вещи. Если вы сохраняете как varbinary и сравниваете с byte[]
, вы должны быть в порядке.
Если вы используете SQL Server 2008, вы также можете использовать:
select convert(varchar(32), hashbytes('MD5', convert(varbinary(200),
'<censored>',0)), 2)
чтобы получить версию с шестнадцатеричным кодированием (вы можете использовать 1
вместо 2
для получения ведущей 0x
)