2015-03-09 4 views
0

Я перехваченное слово "админы" с помощью этого кода C#SHA2_512 шифрования C# и SQL методы дает различные результаты

Byte[] inputBytes = Encoding.UTF8.GetBytes(stringpassword); 
       SHA512 shaM = new SHA512Managed(); 
       Byte[] hashedBytes = shaM.ComputeHash(inputBytes); 

       string hashedpassword = BitConverter.ToString(hashedBytes); 

и получил результат этого «DA-EF-49-53-B9-78- 33-65-CA-D6-61-52-23-72-05-06-CC». и я encrypyt то же самое слово "админ" с помощью SQL хранимую процедуру

SET @password = HASHBYTES('SHA2_512',@password); 

и получить это как выход «ÇDËv *] ¤RùèTýÁàç ¥ * 8_ # О.Е. ± Ø«ÔrcMúÇÓN¼5Ñj · USE»

Почему разница между этими методами?

+0

Как вы объявляете '@ password'. В документации 'HASHBYTES' возвращает' varbinary' (https://msdn.microsoft.com/en-us/library/ms174415.aspx). Возможно, используйте отдельные переменные для хэша и пароля. –

+0

Я зарегистрировал пароль как этот @password varchar (50) –

ответ

2

Из documentation функции HASHBYTES:

Возвращаемое значение

VARBINARY (максимум 8000 байт)

Проблема здесь в том, что вы пытаетесь интерпретировать произвольно двоичные данные (вывод HASHBYTES) как текстовое значение, которое просто не сработает. В этом случае SQL-сервер пытается интерпретировать исходные байтовые значения как символы в любой сортировке, используемой вашей базой данных.

Стандартный способ представления двоичных данных в текстовой форме состоит в том, чтобы преобразовать его в представление base64. Для того, чтобы сделать это в C# заменить последнюю строку с:

string hashedpassword = Convert.ToBase64String(hashedBytes); 

Тогда в вашем SQL вы можете сделать следующее для преобразования значения хэш в base64 (основанный на this SO answer):

DECLARE @hashedValue VARBINARY(8000) = HASHBYTES('SHA2_512', 'admin') 
SELECT 
    CAST(N'' AS XML).value(
      'xs:base64Binary(xs:hexBinary(sql:column("bin")))' 
     , 'VARCHAR(MAX)' 
    ) Base64Encoding 
FROM (
    SELECT @hashedValue AS bin 
) AS bin_sql_server_temp; 

Если вы запустите это вы заметите, что кодированные значения base64 идентичны.

Смежные вопросы