2010-02-24 26 views
17

Estamos almacenando contraseñas hash en una tabla de base de datos.¿Es seguro almacenar contraseñas hash con MD5CryptoServiceProvider en C#?

Premonicionamos cada contraseña con un valor aleatorio de sal y hash usando MD5CryptoServiceProvider.

¿Esto es seguro? He oído que MD5 estaba "roto".

Si no, ¿puede recomendar un método hash alternativo para usar (clase específica de .NET framework)?

+0

Bueno Q. He visto este mismo reclamo. Espero una respuesta informada. –

Respuesta

8

creo SHA256, SHA512 son más seguros en este momento :)

Ver

3

Con una sal, MD5 es mucho más seguro que sin él, pero es mejor que utilice uno de los valores hash SHA como SHA256Managed.

+0

Tenga en cuenta que debe * siempre * saltear contraseñas antes de hash. –

+4

hash con una sal aleatoria solo previene los ataques basados ​​en la tabla rainbow. Si el algoritmo se ha roto, incluso la salazón es inútil. Y desde el 18 de marzo de 2006, "Klima publicó un algoritmo que puede encontrar una colisión dentro de un minuto en una sola computadora portátil, utilizando un método que llama tunelización". para MD5 http://en.wikipedia.org/wiki/MD5, por lo que yo entiendo, MD5 ya no debería ser utilizado. – tobsen

+0

Tengo que estar de acuerdo con tobsen, MD5 es un algoritmo muerto. Se ha eludido de varias maneras, y seguirá siendo atacado y descompuesto. Use algo más seguro como SHA256. – jrista

2

El almacenamiento de la contraseña hash es mejor ya que oculta la contraseña de las miradas indiscretas de los DBA.

Además, sí, MD5 se rompió, pero todavía se utiliza hasta el día de hoy. Si está preocupado por MD5, más bien use SHA-1 (enlace MSDN here). Es un algoritmo hash al igual que MD5 pero más fuerte. Puede tener hash 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. Indicando por qué las personas deberían alejarse de MD5 (http://www.kb.cert.org/vuls/id/836068). Resumen, se trata de "cryptograpically roto"

+2

Según Bruce Schneier, incluso SHA-1 está roto. Y deberíamos usar mejores algoritmos hash http://stackoverflow.com/questions/720710/better-hashing-than-sha1 – tobsen

+0

TRUE, Schneier demostró que SHA-1 no está libre de colisiones. SHA-2 está disponible (no sé para .NET) y SHA-3 está en desarrollo por NIST. El hecho sigue siendo que cualquier SHA es mejor que MD5. –

+0

Los defectos SHA1 se publicaron originalmente hace unos 5 años. Desde ese momento, el poder y la capacidad de computación se han multiplicado. El simple hecho del asunto es que esquivar MD5 o SHA1 está dentro del campo de la posibilidad en estos días, y las probabilidades solo mejoran para el atacante. Incluso salados, los ataques son ataques de colisión truncados, lo que significa que salt + SHA1 es realmente inútil (teniendo en cuenta la paradoja del cumpleaños). Si desea seguridad estable a largo plazo, no use MD5 o SHA1. Use SHA256 o mejor. – jrista

11

La seguridad de una función hash proviene principalmente de la longitud de su producción (mensaje digerir): una digestión más larga proporciona una mayor resistencia a la colisión. La paradoja del cumpleaños nos dice que, en promedio, esperaríamos encontrar una colisión de una función de trabajo de la raíz cuadrada del tamaño de resumen: en otras palabras, dado un resumen de 128 bits, un atacante esperaría golpear a paydirt 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 cryptanalytic interesantes que podrían reducir efectivamente su fuerza. SHA1 (160 bit digest) había sido la alternativa preferida, pero incluso entonces está empezando a parecer que no fue lo suficientemente larga para 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 una competencia de investigación activa organizada por NIST para encontrar un sucesor para SHA-2, pero no tendremos un nuevo estándar hasta 2012 o más.

Ahora, en el caso específico de almacenar contraseñas, noto que está usando un salt. Esta es la práctica altamente recomendada; sin una sal, serías vulnerable a un ataque de mesa arcoiris. Creo que esto te deja con solo el ataque de fuerza bruta a considerar; aquí es donde entra keylength.com. Reúne las recomendaciones para los tamaños de clave y resumen de toda la comunidad criptográfica y ofrece los plazos de seguridad esperados para varios algoritmos, teniendo en cuenta la potencia informática 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 mantenerse seguro (¿tiene una política de cambio forzado de contraseña, 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?

+2

+1 para explicar hashes, qué usar hoy en día y porque mencionó lo que puede hacer para mejorar la seguridad de las contraseñas. – tobsen

7

No, no debería usar MD5. ¡Pero no debería usar una sola ronda de ninguna función de hash de propósito general, sin importar cuán criptográficamente segura sea! No MD5, no SHA-1, no SHA-2, no SHA-3.

¿Por qué? Debido a que las funciones hash de propósito general están diseñadas para ser rápido. Y rápido es exactamente lo que no desea desea en un hash de contraseña. Rápido significa que cuando los tipos malos obtienen su base de datos, pueden ejecutar un simple ataque de diccionario contra ella en un tiempo razonable.

Lo que necesita es lento. La forma más simple de ser lento es repetir la función hash rápida miles de veces: eso es lo que hacen los esquemas de contraseñas basados ​​en MD5 y SHA-1 para almacenar contraseñas en sistemas tipo 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 "brypt".

Este artículo de Matasano, What You Need To Know About Secure Password Schemes, tiene una buena lectura sobre exactamente este tema.

Cuestiones relacionadas