2010-05-31 6 views
5

Attualmente sto cercando di aggiornare un progetto di miniera da NET 3.5 a .NET 4.0SHA1CryptoServiceProvider cambiato in .NET 4

Tutto stava andando molto bene, tutto il codice compilato, tutti i test passati.
Quindi ho riscontrato un problema durante la distribuzione nel mio ambiente di gestione temporanea.
All'improvviso i miei accessi non funzionavano più.

Sembra miei SHA1 hash delle password vengono hash in modo diverso in .NET 4.

sto usando la SHA1CryptoServiceProvider:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 

Per testare Ho creato un nuovo progetto di Visual Studio con 2 applicazioni console.
Il primo destinato a .NET Framework 3.5 e il secondo a 4.0.
Ho eseguito esattamente lo stesso codice di hashing in entrambi e sono stati prodotti risultati diversi.

Perché sta succedendo e come posso risolvere questo problema?
Ovviamente non posso aggiornare tutte le password dei miei utenti considerando che non so cosa siano.

Qualsiasi aiuto sarebbe molto apprezzato.

CODICE ESEMPIO

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

possibile duplicato del [Accesso non riesce dopo l'aggiornamento ad ASP.net 4.0 da 3.5] (http://stackoverflow.com/questions/2739196/login -fails-after-upgrade-to-asp-net-4-0-from-3-5) - soluzione inclusa –

+0

sfortunatamente non è lo stesso. Si tratta di FormsAuthenticationCookies e ViewState ed è solo un problema "se si esegue misto ASP.NET 2.0/ASP.NET 4". Ma DANG ho pensato che fosse la mia soluzione – WebDude

+0

Puoi chiarire la confusione di AsymetricHash/Hash? Giusto per essere al sicuro. –

risposta

2

Uno dei commenti mi ha portato su trovando il bug nel mio codice.
Durante la creazione del mio array di byte da sottoporre a hash, stavo cercando di aggiungere la stringa con una versione invertita di se stesso.

E.g. dato "password" per hash vorrei davvero hash "passworddrowssap"

Tuttavia il mio codice ha un leggero bug in esso:

.Reverse() è un metodo di estensione LINQ che può invertire una stringa.
Tuttavia non restituisce una stringa, restituisce:

IEnumerable<Char> 

Calling .ToString() su questo tipo in realtà ritorna:

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

Fare la stessa cosa in .NET 4.0 restituisce

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

Quindi le mie password venivano sottoposte a hash in modo diverso.
Cosa avrei dovuto fare per creare da array di byte è stato:

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

suona come potrebbe essere il carattere problema di codifica. Assicurarsi che la stringa di essere hash è nella codifica [utf8, ansi etc] che ci si aspetta (e se lo è, assicurarsi che l'ambiente è troppo vecchio.)

-Oisin

+0

Sto usando Encoding.Default. Ho provato a specificare una codifica e nessuno dei seguenti ha lavorato: Encoding.ASCII, Encoding.BigEndianUnicode, Encoding.Unicode, Encoding.UTF32, Encoding.UTF7, Encoding.UTF8 – WebDude

+0

hashing funziona a livello di flusso di byte - Sono non sono sicuro se mi capisci. Stai specificando la codifica dove? Tutto ciò che importa è che entrambi i sistemi sono verificati per alimentare gli stessi _bytes_ alla classe sha1. – x0n

+0

si prega di consultare il codice di esempio che è il metodo che chiamo. Entrambi i siti sono in esecuzione esattamente sullo stesso server, quindi non sono sicuro di dove cambierebbe la codifica. Come posso verificare che entrambi i sistemi alimentino gli stessi byte alla classe sha1? come per il mio esempio di codice precedente, posso semplicemente controllare buffer.Length? – WebDude