encriptar - ¿Es seguro almacenar contraseñas con hash MD5CryptoServiceProvider en C#?
encriptar contraseña c# (5)
Estamos almacenando contraseñas con hash en una tabla de base de datos.
Preparamos cada contraseña con un valor de sal aleatorio y hash utilizando MD5CryptoServiceProvider.
¿Es esto seguro? He oído que el MD5 estaba "roto".
Si no, ¿puede recomendar un método hash alternativo para usar (clase de framework .NET específica)?
Con un MD5 sal es mucho más seguro que sin él, pero es mejor utilizar uno de los hashes SHA como SHA256Managed.
Creo que SHA256, SHA512 son más seguros en este momento :)
Ver wiki
El almacenamiento de la contraseña con hash es mejor, ya que oculta la contraseña de miradas indiscretas de los DBA.
Además, sí, el MD5 se rompió, pero todavía está acostumbrado a este día. Si le preocupa MD5, use SHA-1 (enlace MSDN here ). Es un algoritmo de hash al igual que MD5 pero más fuerte. Puede tener un hashing SHA-1 de hasta 512 bits.
Aquí hay un ejemplo hecho en VB.NET ( http://www.obviex.com/samples/hash.aspx ).
Aquí está el Departamento de Seguridad Nacional de los EE. UU. Que indica por qué las personas deben abandonar el MD5 ( http://www.kb.cert.org/vuls/id/836068 ). Resumen, está "criptográficamente roto"
La seguridad de una función hash proviene principalmente de la longitud de su salida (resumen del mensaje): un resumen más largo proporciona una mayor resistencia a la colisión. La paradoja del cumpleaños nos dice que, en promedio, esperaría encontrar una colisión de una función de trabajo de la raíz cuadrada del tamaño del compendio: en otras palabras, dado un compendio de 128 bits, un atacante esperaría golpear la camisa después de 2 ^ 64 ensayos.
MD5 ha sido mal visto por la comunidad criptográfica desde hace algunos años porque solo tiene un resumen de 128 bits, y también hay algunos resultados criptoanalíticos interesantes que podrían reducir su fuerza de manera efectiva. SHA1 (resumen de 160 bits) había sido la alternativa preferida, pero incluso así parece que no fue lo suficientemente largo como para ser un adversario bien motivado y también hay algunos resultados interesantes en la comunidad de investigación. La familia SHA-2 (tamaños de salida de 224 a 512 bits) son las funciones hash preferidas actualmente en uso generalizado. Hay un concurso de investigación activo organizado por NIST para encontrar un sucesor para SHA-2, pero no tendremos un nuevo estándar hasta el 2012 aproximadamente.
Ahora, en el caso específico de almacenar contraseñas, observo que está usando un salt. Esta es la práctica fuertemente recomendada; sin una sal serias vulnerable a un ataque de mesa arcoiris. Creo que esto te deja solo con el ataque de fuerza bruta para considerar; aquí es donde entra en keylength.com . Reúne recomendaciones para los tamaños de claves y compendios de toda la comunidad criptográfica y brinda los plazos de seguridad esperados para varios algoritmos, considerando el poder de cómputo actual y teniendo en cuenta la Ley de Moore. Considere qué tipo de activos está protegiendo y por cuánto tiempo necesita una contraseña para permanecer seguro (¿tiene una política de cambio de contraseña forzada, por ejemplo?) Y eso debería responder a la pregunta del tamaño de resumen que necesita.
Por supuesto, el mejor almacenamiento de contraseñas del mundo no lo ayudará si sus usuarios usan contraseñas fáciles de adivinar. ¿Proporciona a sus usuarios consejos para contraseñas seguras? ¿Has considerado un medidor de fuerza de contraseña o similar?
No, no deberías estar utilizando MD5. ¡Pero no debería usar una sola ronda de cualquier función hash de propósito general, sin importar cuán criptográficamente segura sea, tampoco! No MD5, no SHA-1, no SHA-2, no SHA-3.
¿Por qué? Porque las funciones hash de propósito general están diseñadas para ser rápidas . Y rápido es exactamente lo que no quieres en un hash de contraseña. Rápido significa que cuando los malos obtienen su base de datos, pueden ejecutar un ataque de diccionario antiguo en su contra en un tiempo razonable.
Lo que necesitas es lento . La forma más sencilla de ser lento es iterar la función hash rápida miles de veces; eso es lo que hace el esquema de contraseña basado en MD5 y SHA-1 utilizado para almacenar contraseñas en sistemas similares a UNIX (no es solo una ronda de MD5 o SHA-1 ). Otra forma es usar una primitiva criptográfica que está diseñada para ser lenta: eso es lo que hace el esquema de contraseña "bcrypt".
Este artículo de Matasano, Lo que necesita saber sobre esquemas de contraseña segura , tiene una buena lectura sobre este tema.