2010-10-12 16 views
9

Tengo un par de diferentes bits de código, pero el cuento es insertar algunas contraseñas en una base de datos MySQL usando SHA1 y calculamos también SHA1 hashes en .NET y no son coincidentes. Creo que esto es un problema con mi código de codificación en .NET.Diferencia en SHA1 en .NET y MySQL

Código SQL:

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

hashes de contraseñas a 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

Código .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); 
} 

hashes a [a ??????% l 3 ~ ???

¡Gracias por cualquier ayuda!

+0

estoy usando este solución en mis aplicaciones de Windows 8: http://stackoverflow.com/questions/17832306/simulating-mysqls-password-encryption-using-net-in-windows-8/ – Rincha

Respuesta

15

En el ejemplo de MySQL está codificando a una cadena hexadecimal, en el ejemplo .NET va a codificar en ASCII. Las dos codificaciones no son lo mismo.

Si convierte a hexadecimal en la versión .NET obtener el resultado correcto:

string hex = BitConverter.ToString(hashedPasswordBytes); 

Resultado:

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

perfecto. necesario convertir para bajar y eliminar el -'s. –

+3

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

3

Es necesario poner en [?a??????%l?3~???HEX representación. Lo que está imprimiendo es probablemente en forma binaria (de ahí los múltiples caracteres ?). Haciendo esto

Probar:

string hexstring = BitConverter.ToString(hashedPasswordBytes); 

y ver si hexstring coincidencia hash y MySQL.

0

¿Cómo está su mesa/base de datos MySQL codificado? Intente configurar tanto a UTF-8 (por lo tanto, utilizando Encoding.UTF8.GetBytes)

1

los valores hash SHA1 deben ser iguales, pero la representación no lo es. MySql da salida a un hexágono-cadena, por lo que tendrá que hacer lo mismo en .NET:

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

+ manymany para evitar esa cosa desagradablemente redundante' Replace() '! – vines

2

del Se le dará una coincidencia exacta con lo que produce MySQL:

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