Сопоставьте хэш, созданный в С# с sql

У меня есть метод, используемый для генерации хэша:

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)))

Ответ 1

из #c с "bleepbloop": 04d3f95947702213e23730a0e8fac6c3

Тогда

select convert(varchar(32), hashbytes('MD5', 'bleepbloop'), 2)

>> 04D3F95947702213E23730A0E8FAC6C3

Или вы можете просто хранить и сравнивать как двоичные файлы.

Ответ 2

Проблема заключается в том, что x2 получает шестнадцатеричное кодирование данных, где-as convert получает ваш сервер, сконфигурированный для декодирования байтов (что действительно не так, поскольку эти данные не являются текстовыми, исходя из). Очень разные вещи. Если вы сохраняете как varbinary и сравниваете с byte[], вы должны быть в порядке.

Если вы используете SQL Server 2008, вы также можете использовать:

select convert(varchar(32), hashbytes('MD5', convert(varbinary(200),
           '<censored>',0)), 2)

чтобы получить версию с шестнадцатеричным кодированием (вы можете использовать 1 вместо 2 для получения ведущей 0x)