2010-10-12 1 views
9

У меня есть пара разных бит кода, но рассказ - это вставить некоторые пароли в базу данных MySQL, используя SHA1, а также вычислить хэши SHA1 в .NET и они не совпадают. Я думаю, что это проблема с моим кодом кодирования в .NET.Разница в SHA1 в .NET и MySQL

SQL код:

INSERT INTO user_credentials (Password) VALUES (SHA1('password')); 

хэши паролей к 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

.NET Код:?

public static string GetPasswordHash(string password) 
{ 
    // problem here with encoding? 
    byte[] byteArray = Encoding.ASCII.GetBytes(password); 

    SHA1 sha = new SHA1CryptoServiceProvider(); 
    byte[] hashedPasswordBytes = sha.ComputeHash(byteArray); 

    return Encoding.ASCII.GetString(hashedPasswordBytes); 
} 

хэши паролей к [а ??????% л 3 ~ ???

Спасибо за помощь!

+0

Я использую это решение в моих приложениях для Windows 8: http://stackoverflow.com/questions/17832306/simulating-mysqls-password-encryption-using-net-in-windows-8/ – Rincha

ответ

15

В примере MySQL вы кодируете строку hexadecimal, в примере .NET вы кодируете в ASCII. Эти два кодировки не совпадают.

Если преобразовать в шестнадцатеричное в версии .NET вы получите правильный результат:

string hex = BitConverter.ToString(hashedPasswordBytes); 

Результат:

 
5B-AA-61-E4-C9-B9-3F-3F-06-82-25-0B-6C-F8-33-1B-7E-E6-8F-D8 
+1

отлично. необходимо было преобразовать в нижний и удалить -s. –

+3

'string hex = BitConverter.ToString (hashedPasswordBytes) .Replace (" - "," ") .ToLower' –

3

Вам нужно поставить [?a??????%l?3~??? в HEX представления. То, что вы печатаете, вероятно, находится в двоичной форме (отсюда несколько символов ?).

Попробуйте сделать это:

string hexstring = BitConverter.ToString(hashedPasswordBytes); 

и посмотреть, если hexstring и MySQL хэш матч.

0

Как кодируется ваша таблица MySQL/база данных? Попробуйте установить как UTF-8 (поэтому используйте Encoding.UTF8.GetBytes)

1

Хеши SHA1 должны быть равны, но представления нет. MySql выводит шестигранную строку, так что вам нужно будет сделать то же самое в .NET:

return String.Join(String.Empty, hashedPasswordBytes.Select(b => b.ToString("x2"))) 
+1

+ manymany для того, чтобы избежать этого неприятного избыточного' Replace() 'thing! – vines

2

Следующие даст вам точное соответствие тому, что производит MySQL:

BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();