2010-10-12 10 views
9

J'ai deux ou trois bits de code différents mais l'histoire courte est que j'insère des mots de passe dans une base de données MySQL en utilisant SHA1 et que je calcule SHA1 hashes dans .NET et ils ne correspondent pas. Je pense que c'est un problème avec mon code d'encodage dans .NET.Différence dans SHA1 dans .NET et MySQL

Code SQL:

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

hashs à 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

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

hashs à [a ??????% l 3 ~ ???

Merci pour toute aide!

+0

J'utilise ce solution dans mes applications Windows 8: http://stackoverflow.com/questions/17832306/simulating-mysqls-password-encryption-using-net-in-windows-8/ – Rincha

Répondre

15

Dans l'exemple MySQL, vous encodez une chaîne hexadecimal, dans l'exemple .NET que vous codez en ASCII. Les deux encodages ne sont pas identiques.

Si vous convertissez en hexadécimal dans la version .NET vous obtenez le résultat correct:

string hex = BitConverter.ToString(hashedPasswordBytes); 

Résultat:

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

parfait. nécessaire de convertir pour abaisser et supprimer le -'s. –

+3

'chaîne hexadécimal = BitConverter.ToString (hashedPasswordBytes) .Replace (" - "," ") .ToLower' –

3

Vous devez mettre [?a??????%l?3~??? dans représentation HEX. Ce que vous imprimez est probablement sous forme binaire (d'où les multiples caractères ?).

Essayez de faire ceci:

string hexstring = BitConverter.ToString(hashedPasswordBytes); 

Et voir si hexstring et MySQL correspondance de hachage.

0

Comment votre table/base de données MySQL est-elle codée? Essayez de définir les deux à UTF-8 (donc en utilisant Encoding.UTF8.GetBytes)

1

Les hachages SHA1 doivent être égaux, mais la représentation ne l'est pas. MySql émet un hex-string, de sorte que vous devrez faire la même chose dans .NET:

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

+ manquant d'éviter cette chose odieusement redondante' Replace() '! – vines

2

Ce qui suit vous donnera une correspondance exacte à ce que MySQL produit:

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