2010-05-31 5 views
5

J'essaie actuellement de mettre à jour un projet de la mine de .NET 3.5 à 4.0 .NETSHA1CryptoServiceProvider a changé dans .NET 4

Tout allait vraiment bien, tout le code compilé, tous les tests passés.
Ensuite, j'ai rencontré un problème de déploiement dans mon environnement de transfert.
Soudain, mes connexions ne fonctionnaient plus.

Il semble que mes SHA1 mots de passe hachés sont hachés différemment dans .NET 4.

J'utilise le SHA1CryptoServiceProvider:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 

Pour tester, j'ai créé un nouveau projet Visual Studio avec 2 applications de la console.
Le premier ciblé sur .NET Framework 3.5 et le second sur 4.0.
J'ai exécuté exactement le même code de hachage dans les deux et différents résultats ont été produits.

Pourquoi cela se produit-il et comment puis-je résoudre ce problème?
Je ne peux évidemment pas mettre à jour tous les mots de passe de mes utilisateurs étant donné que je ne sais pas ce qu'ils sont.

Toute aide serait grandement appréciée.

CODE EXEMPLE

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

double possible de [Connexion échoue après mise à niveau vers ASP.net 4.0 de 3.5] (http://stackoverflow.com/questions/2739196/login -fails-after-upgrade-to-asp-net-4-0-from-3-5) - solution incluse –

+0

malheureusement ce n'est pas la même affaire. Cela concerne FormsAuthenticationCookies et ViewState et est seulement un problème "si vous exécutez mixte ASP.NET 2.0/ASP.NET 4". Mais DANG je pensais que c'était ma solution – WebDude

+0

Pouvez-vous éclaircir la confusion AsymetricHash/Hash? Juste pour être sûr. –

Répondre

2

Un des commentaires m'a conduit sur trouver le bug dans mon code.
Lors de la création de mon tableau d'octets à hacher, j'essayais d'ajouter la chaîne avec une version inversée de lui-même.

E.g. donné "mot de passe" de hachage je fait hash "passworddrowssap"

Cependant mon code a un léger bug dans le:

.Reverse() est une méthode d'extension LINQ qui peut inverser une chaîne.
Cependant, il ne retourne pas une chaîne, il retourne:

IEnumerable<Char> 

Appel .ToString() sur ce type revient en fait:

System.Linq.Enumerable + d__99`1 [Système. Char]

Faire la même chose dans .NET 4.0 déclarations

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

Par conséquent, mes mots de passe ont été hachés différemment.
Ce que je aurais dû faire pour créer par tableau d'octets est:

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

Sonne comme il pourrait être le caractère problème de codage. Assurez-vous que la chaîne étant hachée est dans le codage [UTF8, ansi etc] que vous attendez (et si elle est, assurez-vous que l'ancien environnement est trop.)

-Oisin

+0

J'ai utilisé Encoding.Default. J'ai essayé spécifier un codage et aucun des suivants ont fonctionné: Encoding.ASCII, Encoding.BigEndianUnicode, Encoding.Unicode, Encoding.UTF32, Encoding.UTF7, Encoding.UTF8 – WebDude

+0

fonctionne hash au niveau du flux d'octets - Je suis Je ne sais pas si tu me comprends. Vous spécifiez l'encodage où? Tout ce qui compte, c'est que les deux systèmes vérifient que les mêmes octets sont fournis à la classe sha1. – x0n

+0

s'il vous plaît voir l'exemple de code qui est la méthode que j'appelle. Les deux sites s'exécutent exactement sur le même serveur, donc je ne sais pas où l'encodage changerait. Comment puis-je vérifier que les deux systèmes fournissent les mêmes octets à la classe sha1? selon mon exemple de code ci-dessus, puis-je simplement vérifier buffer.Length? – WebDude

Questions connexes