2010-02-24 26 views
50

Como muchos sabrán, el cifrado unidireccional es una forma práctica de cifrar las contraseñas de los usuarios en las bases de datos. De esta forma, incluso el administrador de la base de datos no puede conocer la contraseña de un usuario, pero tendrá que tomar una contraseña, cifrarla con el mismo algoritmo y luego comparar el resultado con la contraseña cifrada en la base de datos. Esto significa que el proceso de descifrar la contraseña requiere cantidades masivas de conjeturas y mucho poder de procesamiento.¿Cuál es actualmente el algoritmo de encriptación unidireccional más seguro?

Al ver que las computadoras se vuelven cada vez más rápidas y que los matemáticos todavía están desarrollando estos algoritmos, me pregunto cuál es el más seguro teniendo en cuenta la potencia informática moderna y las técnicas de encriptación.

He estado usando MD5 casi exclusivamente desde hace años, y me pregunto si hay algo más que debería estar haciendo. ¿Debo estar contemplando un algoritmo diferente?

Otra pregunta relacionada: ¿Cuánto tiempo debería ser un campo típicamente para una contraseña tan encriptada? Debo admitir que no sé prácticamente nada sobre el cifrado, pero supongo que un hash MD5 (como ejemplo) puede ser más largo y, presumiblemente, necesitaría más potencia de procesamiento para descifrar. ¿O la longitud del campo no importa en absoluto, siempre que la contraseña encriptada encaje en ella en primer lugar?

+27

Las funciones hash no son funciones de cifrado. Las funciones de cifrado tienen funciones inversas para descifrar un valor encriptado para obtener el valor original. Pero los hash no se pueden descifrar. Solo es posible encontrar colisiones (valores de entrada que dan como resultado el mismo valor hash). – Gumbo

+3

La salida de cualquier función/algoritmo hash dada siempre tiene la misma longitud. Para MD5 siempre es de 128 bits, independientemente de la longitud de los bits de entrada/bytes/cadena. –

+0

No se preocupe por la longitud del campo. En casi todos los casos, adivinar contraseñas y mezclarlos será mucho más rápido que forzar una colisión bruta, y 128 bits es lo suficientemente grande como para resistir ataques de fuerza bruta hasta la muerte por calor del Universo. –

Respuesta

53

Advertencia: Dado que este post fue escrito en 2010, las GPU han sido ampliamente desplegado ataque de fuerza bruta hashes de contraseñas. Las GPU de precio moderado pueden ejecutar diez mil millones MD5 por segundo. Esto significa que incluso una contraseña alfanumérica de 8 caracteres completamente aleatoria (62 caracteres posibles ) se puede forzar en 6 horas. SHA-1 es solo un poco más lento , tomaría un día. Las contraseñas de usuario son mucho más débiles, y (incluso con salazón) disminuirán a una tasa de miles de contraseñas por segundos. Las funciones hash son diseñadas para ser rápidas. No quiere esto para contraseñas. Utilice scrypt, bcrypt o PBKDF-2.

MD5 se encontró que era débil en el año 1996, y should not be used anymore para los propósitos criptográficos. SHA-1 es un reemplazo de uso general, pero has similar problems. El SHA-2 family de funciones hash es el replacement actual de SHA-1. Los miembros de SHA-2 se denominan individualmente SHA-224, SHA-256, SHA-384 y SHA-512.

En este momento, varias funciones hash are competing to become SHA-3, el siguiente algoritmo de hash criptográfico estandarizado. Se elegirá un ganador en 2012. ¡Ninguno de estos debe usarse todavía!

Para contraseñas hash, también puede considerar el uso de algo como bcrypt. Está diseñado para ser lo suficientemente lento como para hacer inviables los ataques de fuerza bruta a gran escala. Puede ajustar la lentitud usted mismo, por lo que puede ser más lento cuando las computadoras se vuelven más rápidas.

Advertencia: bcrypt se basa en un antiguo algoritmo de cifrado bidireccional, Blowfish, para el que existen mejores alternativas en la actualidad. No creo que las propiedades criptográficas hash de bcrypt sean completamente entendidas. Que alguien me corrija si me equivoco; Nunca he encontrado una fuente confiable que discuta las propiedades de bcrypt (aparte de su lentitud) desde una perspectiva criptográfica.

Puede ser un poco tranquilizador que el riesgo de colisiones sea menos importante para el uso de contraseñas que para la criptografía de clave pública o las firmas digitales. Usar MD5 hoy es un terrible idea para SSL, pero no es igualmente desastroso para el hash de contraseñas. Pero si tiene la opción, simplemente elija uno más fuerte.

El uso de una buena función hash es not enough para proteger sus contraseñas. Debe hash las contraseñas junto con salts que son largas y cryptographically random. También debe ayudar a sus usuarios a elegir contraseñas más fuertes o pasar frases si es posible. Más tiempo siempre es mejor.

+6

"Más tiempo siempre es mejor". No * necesariamente * verdadero. He escuchado afirmaciones anecdóticas de que obligar a los usuarios a elegir contraseñas más largas a veces hace que elijan contraseñas con * less * entropy, para que puedan recordarlas. Personalmente puedo recordar una contraseña de 8 alfanuméricos generada aleatoriamente si la estoy usando a diario. Más que eso y voy a recurrir a inventar contraseñas yo mismo, y no sé qué entropía tienen. –

+1

@Steve Attackers no pasan gradualmente de los intentos de contraseña de baja entropía a los más altos. Intentan atacar el diccionario y luego hay fuerza bruta. Por lo tanto, "ooGoo! Ooooooo876" tiene una entropía menor que "d! NA0sue732bnfuw", pero no es menos seguro. – Lucas

+0

Para el hashing de contraseñas, MD5 aún se debe considerar como una opción razonable (como ha insinuado), siempre que sus contraseñas sean sólidas y use una sal (que se aplicaría a cualquier hash). Los ataques de colisión son en gran medida irrelevantes para el hashing de contraseñas, según entiendo. – MarkR

6

Para aumentar la seguridad de la contraseña, debe usar una variedad más amplia de símbolos. Si tiene entre 8 y 10 caracteres en la contraseña, se vuelve bastante difícil de descifrar. Aunque hacerlo más largo lo hará más seguro, solo si usa caracteres numéricos/alfabéticos/otros.

SHA1 es otro algoritmo hash (cifrado unidireccional), es más lento, pero tiene un resumen más largo. (mensaje codificado) (160 bit) donde MD5 solo tiene 128 bit.

Entonces SHA2 es aún más seguro, pero usa menos.

+7

Notaré que más lento es en realidad un * beneficio * cuando se trata de defenderse contra ataques de fuerza bruta. –

+0

@Anon: ¡Tienes razón! Gracias por mencionarlo :) –

+1

No es tanto "más lento" como "difícil de hacer rápido incluso con hardware dedicado/tablas precalculadas/análisis matemáticos ..." que es importante. La razón de ser del concurso NIST SHA-3 es que las funciones de hash criptográficas actuales, aunque aún tan lentas como antes en las computadoras de propósito general, se han debilitado recientemente por varias otras razones. Especialmente MD5 (ver la página de MD5 Wikipedia). –

3

salazón la contraseña es siempre un nivel adicional de defensa

$salt = 'asfasdfasdf0a8sdflkjasdfapsdufp'; 
$hashed = md5($userPassword . $salt); 
+1

Es importante que se genere una sal nueva cada vez que se establezca una contraseña, no será un valor fijo. – caf

+0

@caf: ¿Eso no haría que el cálculo tome más tiempo si fuera siempre el mismo, aumentando así el tiempo que llevaría la fuerza bruta? - Si la sal es diferente cada vez, debería almacenarse en la misma fila que la contraseña para que el mecanismo de inicio de sesión pueda comparar el intento de hash con la contraseña real. – Teekin

+0

Si la sal es siempre la misma, el atacante puede a) aplicar fuerza bruta a todas sus contraseñas en paralelo (cada hash de prueba se puede comparar con todos los hashes de contraseña); yb) calcular los hashes antes de ver su base de datos. Sí, la sal debe almacenarse junto con el hash; eso es exactamente lo que hacen los hash de contraseñas al estilo UNIX. – caf

10

Muy buena pregunta! This page es una buena lectura. En particular, el autor afirma que MD5 no es apropiado para contraseñas hash:

El problema es que MD5 es rápido. También lo son sus competidores modernos, como SHA1 y SHA256. La velocidad es un objetivo de diseño de un hash seguro moderno, porque los hashes son un bloque de construcción de casi todos los criptosistemas y, por lo general, se ejecutan a demanda por paquete o por mensaje.

La velocidad es exactamente lo que no desea en una función de hash de contraseña.

En el artículo se va a explicar algunas de las alternativas, y recomienda Bcrypt como la "decisión correcta" (sus palabras, no las mías).

Descargo de responsabilidad: No he probado Bcrypt en absoluto. Considere esto como una recomendación amistosa, pero no como algo que pueda respaldar con mi propia experiencia técnica.

+0

El autor también recomienda el esquema de hash de contraseñas desarrollado para FreeBSD, que utiliza MD5 en su núcleo pero itera la función hash miles de veces. Hay una construcción similar basada en SHA-1 disponible en glibc. – caf

+1

+1 por citar a Matasano :) –

0

NIST se está ejecutando actualmente un concurso para seleccionar un nuevo algoritmo hash, al igual que lo hicieron para seleccionar el algoritmo de cifrado AES. Entonces, la respuesta a esta pregunta probablemente será diferente en un par de años.

Puede buscar los envíos y estudiarlos usted mismo para ver si hay alguno que desee utilizar.

3

Al ver que las computadoras se vuelven cada vez más rápido y que los matemáticos siguen el desarrollo de estos algoritmos

cifrado RSA es seguro ya que se basa en un número muy grande de ser duro al factor. Eventualmente, las computadoras se volverán lo suficientemente rápidas para factorizar el número en un tiempo razonable. Para mantenerse por delante de la curva, usa un número mayor.

Sin embargo, para la mayoría de los sitios web, el propósito de las contraseñas hash es hacer incómodo para que alguien tenga acceso a la base de datos para leer la contraseña, no para proporcionar seguridad. Para ese propósito, MD5 está bien .

La implicación aquí es que si un usuario malintencionado obtiene acceso a toda su base de datos, no necesita la contraseña. (La cerradura de la puerta no me va a impedir que entraba por la ventana.)


El hecho de que MD5 es "roto" no significa que sólo puede revertir cuando lo desee.

+2

"Sin embargo, para la mayoría de los sitios web, el propósito de las contraseñas hash es que no sea conveniente para alguien con acceso a la base de datos leer la contraseña, no proporcionar seguridad". - esto puede ser lo que la mayoría de los sitios web obtienen, pero el propósito debería ser hacer que no sea práctico revertir cualquiera de las contraseñas almacenadas de sus usuarios, y hacerlo es totalmente factible. –

+0

Estoy de acuerdo, he tratado de explicar a mis colegas por qué las debilidades en MD5 no deberían impedir su uso para el hashing de contraseñas. Ni que decir tiene que es aconsejable usar una sal y una contraseña mínima – MarkR

1

Además de ser una función unidireccional criptográficamente segura, una buena función hash para la protección con contraseña debe ser una fuerza difícil de usar, es decir, lenta por diseño. scrypt es uno de los mejores en esa área. Desde la página principal:

Estimamos que en el hardware moderno (2009), si es de 5 segundos se gastan el cálculo de una clave derivada, el coste de un ataque de hardware de fuerza bruta contra scrypt es aproximadamente 4000 veces mayor que el costo de un ataque similar contra bcrypt (para encontrar la misma contraseña), y 20000 veces mayor que un ataque similar contra PBKDF2.

Dicho esto, a partir de las funciones hash comúnmente disponibles, hacer unos miles de iteraciones de cualquier cosa de la familia SHA es una protección bastante razonable para contraseñas no críticas.

Además, siempre agregue una sal para que sea imposible compartir el esfuerzo de forzar muchos hashes a la vez.

Cuestiones relacionadas