2010-05-31 12 views
5

Ich bin derzeit versucht, ein Projekt von mir von .NET 3.5 auf .NET 4.0SHA1CryptoServiceProvider geändert in .NET 4

Alles wirklich gut lief zu aktualisieren, alle Code kompiliert, alle Tests bestanden.
Dann traf ich ein Problem bei der Bereitstellung in meiner Staging-Umgebung.
Plötzlich funktionierten meine Logins nicht mehr.

Es scheint, meine SHA1 Hash-Passwörter anders in .NET gehasht werden 4.

ich den SHA1CryptoServiceProvider bin mit:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 

Um zu testen ich ein neuen Visual Studio-Projekt mit zwei Konsolenanwendungen erstellt.
Die erste zielte auf .NET Framework 3.5 und die zweite auf 4.0.
Ich lief genau den gleichen Hash-Code in beiden und verschiedene Ergebnisse wurden produziert.

Warum passiert das und wie kann ich das beheben?
Ich kann natürlich nicht alle meine Benutzer Passwörter aktualisieren, da ich nicht weiß, was sie sind.

Jede Hilfe würde sehr geschätzt werden.

CODE SAMPLE

public static class SHA1Hash 
{ 

    public static string Hash(string stringToHash) 
    { 
     return (Hash(stringToHash, Encoding.Default)); 
    } 

    public static string Hash(string stringToHash, Encoding enc) 
    { 
     byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse()); 
     var cryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 
     string hash = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)); 
     return hash; 
    } 
} 
+0

möglich Duplikat [Anmeldung nicht nach dem Upgrade auf ASP.net 4.0 von 3.5] (http://stackoverflow.com/questions/2739196/login -fails-nach-upgrade-zu-asp-net-4-0-from-3-5) - lösung enthalten –

+0

leider ist das nicht der gleiche fall. Dies betrifft FormsAuthenticationCookies und ViewState und ist nur ein Problem, "wenn Sie gemischte ASP.NET 2.0/ASP.NET 4 ausführen". Aber DANG Ich dachte, es war meine Lösung – WebDude

+0

Können Sie die AsymetricHash/Hash-Verwirrung klären? Nur um sicher zu sein. –

Antwort

2

Einer der Kommentare führte mich auf finde den Fehler in meinem Code.
Beim Erstellen meines Bytearrays, das gehashed werden soll, habe ich versucht, den String mit einer umgekehrten Version von sich selbst anzuhängen.

z. Hash „passworddrowssap“ zu Hash gegeben „Passwort“ würde ich tatsächlich

aber mein Code einen leichten Fehler in sich hat:

.Reverse() ist eine Linq-Erweiterungsmethode, die eine Zeichenfolge rückgängig machen kann.
jedoch nicht einen String zurückgibt, gibt sie:

IEnumerable<Char> 

Aufruf .ToString() auf dieser Art gibt tatsächlich:

System.Linq.Enumerable + d__99`1 [System. char]

die gleiche Sache in .NET 4.0 tun kehrt

S ystem.Linq.Enumerable + d__a0`1 [System.Char]

Daher wurden meine Passwörter unterschiedlich gehashed.
Was soll ich von Byte-Array erstellen getan haben, war:

byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray())); 
0

Klingt wie es Zeichencodierung Problem sein könnte. Stellen Sie sicher, dass die Zeichenfolge, die in der Codierung gehasht ist [utf8, ansi etc] Sie erwarten (und wenn es ist, sicherzustellen, dass die alte Umgebung auch.)

-Oisin

+0

Ich habe Encoding.Default verwendet. Ich habe versucht, eine Codierung und keiner der folgenden funktioniert: Encoding.ASCII, Encoding.BigEndianUnicode, Encoding.Unicode, Encoding.UTF32, Encoding.UTF7, Encoding.UTF8 – WebDude

+0

Hashing funktioniert auf Byte-Stream-Ebene - ich bin nicht sicher, ob du mich verstehst. Sie geben die Codierung an, wo? Alles, was zählt, ist, dass beide Systeme verifiziert werden, dass sie die gleiche _bytes_ der Klasse sha1 zuführen. – x0n

+0

Bitte sehen Sie sich das Codebeispiel an, welches die Methode ist, die ich anrufe. Beide Websites laufen auf demselben Server, sodass ich nicht sicher bin, wo sich die Codierung ändern würde. Wie kann ich überprüfen, dass beide Systeme der Klasse sha1 dieselben Bytes zuführen? nach meinem obigen Codebeispiel, kann ich nur Puffer überprüfen.Länge? – WebDude