2009-08-19 21 views
18

¿Podría por favor recomendarme algún algoritmo fácil para hash contraseña de usuario por MD5, pero con sal para aumentar la fiabilidad.hash MD5 con sal para mantener la contraseña en DB en C#

Ahora tienen éste:

private static string GenerateHash(string value) 
{ 
    var data = System.Text.Encoding.ASCII.GetBytes(value); 
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data); 
    return Convert.ToBase64String(data); 
} 
+5

¿Por qué utilizar un hash roto como MD5? Como mínimo, use algo como SHA-256. –

+6

Bueno, ¿por qué NO usar MD5? Usar una sal mitiga razonablemente la vulnerabilidad debido a la falta de resistencia a la colisión del MD5, ¿no? –

+1

@Greg, ¿podría darnos algún ejemplo de uso, con sal si corresponde? – abatishchev

Respuesta

40

Usted puede utilizar la clase HMACMD5:

var hmacMD5 = new HMACMD5(salt); 
var saltedHash = hmacMD5.ComputeHash(password); 

Funciona con SHA-1, SHA256, SHA384, SHA512 y RIPEMD160 así:

var hmacSHA1 = new HMACSHA1(salt); 
var saltedHash = hmacSHA1.ComputeHash(password); 

Tanto salt y password se espera que las matrices de bytes .

Si tiene cadenas que tendrá que convertirlos en bytes primera:

var salt = System.Text.Encoding.UTF8.GetBytes("my salt"); 
var password = System.Text.Encoding.UTF8.GetBytes("my password"); 
+1

http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.hmacsha1.aspx El constructor HMACSHA1 no acepta una sal sino una clave como parámetro único – abatishchev

+4

Generalmente, se utiliza un HMAC para obtener la clave hash de un mensaje. Si reemplaza la llave con un salt y el mensaje con su contraseña, puede usar el HMAC para obtener el hash salado de una contraseña. – dtb

+0

¿Hay alguna forma de descifrar la contraseña salada? – Sana

12

Aquí hay una sample. Maneja MD5, SHA1, SHA256, SHA384 y SHA512.

+0

lástima que esta respuesta no estuviera centrada en el código como la aceptada. es altamente/más útil y rápido de implementar. ¡Gracias! – zanlok

1

Microsoft han hecho este trabajo para usted, pero se necesita un poco de excavación. Instale Web Service Extensions 3.0 y eche un vistazo a la función Microsoft.Web.Services3.Security.Tokens.UsernameToken.ComputePasswordDigest con Reflector.

Me gustaría publicar aquí el código fuente de esa función, pero no estoy seguro de si es legal hacerlo. Si alguien puede tranquilizarme, lo haré.

+3

Sospecho que la legalidad depende mucho de dónde se encuentre. En algunas jurisdicciones, es ilegal que usted mismo mire el código descompilado, ¡y mucho menos que lo publique para que otros lo puedan ver! – LukeH

+2

Aunque con Visual Studio 2008 es posible ver el código fuente de .net al depurar, siempre que haya aceptado los términos y condiciones de MS para eso. –

3

Además de la clase HMACSHA1 mencionado anteriormente, si sólo tiene un hash salado rápida, entonces ya se encuentra el 95% del camino:

private static string GenerateHash(string value, string salt) 
{ 
    byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value); 
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data); 
    return Convert.ToBase64String(data); 
} 

El verdadero truco es el almacenamiento de la sal en una ubicación segura, como su machine.config.

+0

¿Podría la marca de tiempo ser una buena sal? o el descubrimiento de tal hecho comprometerá todo el algoritmo? – abatishchev

+0

La marca de tiempo no funcionaría porque cuando vaya a validar el hash contra la nueva entrada, el tiempo será diferente. – Fantius

+0

A menos que almacene la marca de tiempo junto con el resumen, en cuyo caso funcionaría, pero no sería muy seguro. – Fantius

Cuestiones relacionadas