2010-10-12 12 views
9

Ich habe ein paar verschiedene Bits Code, aber die Kurzgeschichte ist, dass ich einige Kennwörter in eine MySQL-Datenbank mit SHA1 einfügen und auch SHA1 Hashes in .NET berechnen und sie nicht übereinstimmen. Ich denke, das ist ein Problem mit meinem Kodierungscode in .NET.Unterschied in SHA1 in .NET und MySQL

SQL-Code:

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

Passwort-Hashes

.NET-Code 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8:?

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

Passwort-Hashes zu [einem ??????% l 3 ~ ???

Danke für jede Hilfe!

+0

Ich verwende diese Lösung in meinen Windows 8-Anwendungen: http://StackOverflow.com/Questions/17832306/simulating-Mysqls-password-encryption-using-net-in-windows-8/ – Rincha

Antwort

15

Im MySQL Beispiel codieren Sie eine hexadecimal Zeichenkette, in dem .NET Beispiel kodieren Sie in ASCII. Die beiden Kodierungen sind nicht gleich.

Wenn Sie hexadezimale in der .NET-Version konvertieren erhalten Sie das richtige Ergebnis:

string hex = BitConverter.ToString(hashedPasswordBytes); 

Ergebnis:

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

perfekt. benötigt, um in niedrigere umzuwandeln und die -'s zu entfernen. –

+3

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

3

Sie müssen [?a??????%l?3~??? in HEX Darstellung bringen. Was Sie drucken, ist wahrscheinlich in binärer Form (daher die multiplen ? Zeichen).

Versuch dies zu tun:

string hexstring = BitConverter.ToString(hashedPasswordBytes); 

Und sehen, ob hexstring und MySQL Hash-Übereinstimmung.

0

Wie ist Ihre MySQL-Tabelle/Datenbank kodiert? Versuchen Sie, beide auf UTF-8 zu setzen (also mit Encoding.UTF8.GetBytes)

1

Die SHA1-Hashes sollten gleich sein, aber die Darstellung ist nicht. MySql gibt einen Hex-String, so dass Sie das gleiche in .NET tun müssen:

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

+ manymany für die Vermeidung dieser überflüssigen' Replace() 'Sache! – vines

2

Nachfolgend erhalten Sie eine genaue Übereinstimmung zu dem, was MySQL produziert:

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