2010-10-12 11 views
9

Mam kilka różnych fragmentów kodu, ale krótka historia to wstawienie niektórych haseł do bazy danych MySQL przy użyciu SHA1, a także obliczenie skrótów SHA1 do .NET i nie są one zgodne. Myślę, że to jest problem z moim kodowaniem kodu w .NET.Różnica w SHA1 w .NET i MySQL

kod SQL:

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

hasło skróty do 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

Kod .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); 
} 

hasło skróty do [a ??????% L 3 ~ ???

Dzięki za pomoc!

+0

Używam tego rozwiązanie w moich aplikacjach Windows 8: http://stackoverflow.com/questions/17832306/simulating-mysqls-password-encryption-using-net-in-windows-8/ – Rincha

Odpowiedz

15

W przykładzie MySQL kodujesz do łańcucha hexadecimal, w przykładzie .NET kodujesz w ASCII. Dwa kodowania nie są takie same.

Jeśli konwersja do postaci szesnastkowej w wersji .NET można uzyskać poprawny wynik:

string hex = BitConverter.ToString(hashedPasswordBytes); 

Wynik:

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

perfect. potrzebne do przejścia na niższe i usunięcia -'s. –

+3

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

3

trzeba umieścić [?a??????%l?3~??? w HEX reprezentacji. To, co drukujesz, jest prawdopodobnie w formie binarnej (stąd wiele znaków ?).

spróbować zrobić to:

string hexstring = BitConverter.ToString(hashedPasswordBytes); 

i zobaczyć czy hexstring i MySQL skrótu meczu.

0

W jaki sposób jest zakodowana tabela/baza danych MySQL? Spróbuj ustawić zarówno kodowanie UTF-8 (dlatego używając Encoding.UTF8.GetBytes)

1

Hasła SHA1 powinny być równe, ale reprezentacja nie jest. MySql wyprowadza hex-string, więc trzeba będzie zrobić to samo w .NET:

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

+ manymany za uniknięcie tego nieprzyjemnie redundantnego' Replace() 'rzeczy! – vines

2

Poniższa daje dokładne dopasowanie do tego, co produkuje MySQL:

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