Разница в SHA1 в .NET и MySQL - PullRequest
       56

Разница в SHA1 в .NET и MySQL

9 голосов
/ 12 октября 2010

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

Код 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);
}

хэши паролей для [? A ??????% l? 3 ~ ???

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

Ответы [ 5 ]

15 голосов
/ 12 октября 2010

В примере MySQL вы кодируете в шестнадцатеричную строку, в примере .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
3 голосов
/ 12 октября 2010

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

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

string hexstring = BitConverter.ToString(hashedPasswordBytes);

и посмотрите, совпадают ли hexstring и хэш MySQL.

2 голосов
/ 20 марта 2012

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

 BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();
1 голос
/ 12 октября 2010

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

return String.Join(String.Empty, hashedPasswordBytes.Select(b => b.ToString("x2")))
0 голосов
/ 12 октября 2010

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

...