2010-06-29 14 views

Respuesta

36

Si almacena una contraseña cifrada, se puede descifrar. Como muchas personas reutilizan las contraseñas en muchos sistemas diferentes, esto es algo malo. De modo que usa una función unidireccional, una función hash criptográfica, de esta forma se puede verificar una contraseña sin revelarla realmente.

Como comentó Greg, AES es un algoritmo de cifrado/descifrado. MD5 y la familia SHA son funciones hash, que son las más apropiadas para usar. Pero aléjese de MD5 hoy en día, en realidad ya no se considera lo suficientemente seguro como. Xiaoyun Wang publicó un ataque de colisión efectivo contra él en 2005, y ahora se considera que su fortaleza es considerablemente inferior a su fuerza de diseño, por lo que en términos criptográficos está "roto".

Para obtener los mejores resultados, el estándar es sal y hash una contraseña para almacenarlo - google estos términos en tándem y encontrará numerosas referencias.

+0

Sin embargo, con una sal que lo hace bien ¿no? – Metropolis

+0

Siempre que esté bien salado, md5 es menos inseguro que un hash recto md5, y adecuado para la mayoría de los sitios; aunque todavía utilizo la familia SHA o me maduro –

+0

Hay una grieta en su armadura. Esto no significa que las contraseñas almacenadas en sal y hash con MD5 sean vulnerables ... todavía. Pero con la grieta en la armadura que podría llevar a más exploits, ¿por qué correr el riesgo si tienes una alternativa? –

6

MD5 (Message-Digest algorithm 5) es una función hash criptográfica, mientras que Advanced Encryption Standard (AES) es un algoritmo de cifrado de clave simétrica, por lo que se utilizan para diferentes propósitos. Un hash, como MD5 o SHA se usa para verificar las contraseñas porque es difícil de invertir, es decir, para obtener la contraseña de la cadena de caracteres. Un cifrado AES, por otro lado, es invertible, el mensaje original puede obtenerse si conoce la clave. Por lo tanto, si se encriptan múltiples mensajes con la misma clave, sabiendo que los expone a todos, mientras que si logra encontrar la cadena original de un hash (tablas de arcoiris, etc.), solo ha descubierto el texto sin formato para esa instancia en particular, y Tendrás que volver a hacer el trabajo para encontrar una solución para otra cadena hash.

1

Porque el cifrado AES es simétrico. Dada una contraseña cifrada con AES y la clave, puede descifrar la contraseña. Esto es indeseable, ya que casi siempre quiere que solo el propietario de la contraseña lo conozca y no desea tener una forma fácil de derivar la contraseña. Los algoritmos SHA y MD5, por otro lado, realizan una transformación (en su mayoría) unidireccional de la contraseña. No hay ninguna información (clave) que le permita devolver la contraseña transformada a su formato de texto plano.

+3

La naturaleza simétrica de AES no tiene nada que ver con la capacidad de descifrado: también puede descifrar cosas cifradas con un algoritmo de cifrado asimétrico. –

+1

Creo que quiere decir * simétrico * como en * bidireccional * o * bidireccional *. –

1

El uso de AES como un cifrado simétrico para las contraseñas sería una vocación de CWE-257 y existe una vulnerabilidad. Es posible usar un symmetric cipher as a hash function. Las viejas contraseñas Unix usan DES como una función hash y los sistemas Unix más nuevos usan blowfish como función hash. Pero a pesar de que es un cifrado de bloque, se usa como una función de un solo sentido, que es un requisito para cualquier sistema de almacenamiento de contraseñas.

Para php debe usar sha256.

+0

CWE-257 suena extraño. "Si un administrador del sistema puede recuperar una contraseña directamente, (...) el administrador puede usar la contraseña en otras cuentas". Quiero decir, ¿cómo puede ayudarte la contraseña de hash, cuando cada vez que inicias sesión envías tu contraseña en texto plano al administrador? –

+0

@ el.pescado Un administrador malicioso podría modificar la aplicación para registrar las contraseñas de texto sin formato. Sin embargo, creo que este cwe es importante porque, a partir de una prescripción de piratas informáticos, la clave podría obtenerse y todas las contraseñas podrían ser descifradas de una sola vez. Esto hace que los ataques como la inyección sql sean mucho más graves. No hay absolutamente ninguna razón para debilitar su aplicación mediante el uso de un cifrado de bloque. – rook

+0

... a menos que desee proporcionar un protocolo de autenticación fuerte, que a menudo requiere contraseñas reversibles. Sin embargo, este no suele ser el caso en las aplicaciones PHP. –

4

En resumen: AES es reversible. Una función hash no lo es.

Respondiendo a la respuesta aceptada ... (Lo siento, soy un usuario nuevo, no puedo publicar comentarios todavía ...) La salazón solo previene los ataques basados ​​en la tabla Rainbow. No protege "contraseñas débiles". Para proteger las contraseñas más débiles, necesitará usar una función hash que se ha demostrado que es lenta. Una bcrypt configurada correctamente es la forma más fácil de hacerlo. MD5 y SHA1 son demasiado rápidos para ser seguros. (Las colisiones encontradas con MD5 no están relacionadas con este problema que estoy describiendo)

Todas las contraseñas de 8 caracteres cifradas con MD5 o SHA1 (incluso cuando están correctamente saladas) se pueden descifrar por this dude in a single day. Salar no previene este tipo de ataque. "Optimizando" el ataque para que consista de solo ~ 500k de palabras en inglés ...y las 10,000 variaciones más comunes de ellos crackearán una gran cantidad de contraseñas.

BCrypt es más fuerte contra este tipo de ataque porque (se puede configurar que sea) millones de veces más lento que MD5. Iterativamente, usar MD5 un millón de veces teóricamente logrará lo mismo, pero te sugiero que te apegues a bibliotecas bien probadas en lugar de implementar tu propia implementación. BCrypt también usa Salting, y está disponible en la mayoría de los lenguajes de programación. Entonces no hay razón para NO usarlo.

En teoría, Scrypt es mejor, pero es demasiado nuevo (y por lo tanto, las implementaciones son probablemente todavía un poco con errores)

Para resumir: SHA512 vs. Blowfish and Bcrypt

1

La razón principal por la que el uso simétrico (o asimétrica) El cifrado no es aconsejable para proteger contraseñas: key management. Al utilizar el cifrado, debe proteger la clave de cifrado (o las entropías de las que se deriva la clave). Y proteger la clave es una tarea muy difícil de resolver. Hashing (con SHA, MD5 o cualquier otro algoritmo) resuelve el problema de la protección de claves, ya que no necesita mantener ningún valor secreto (aparte de la sal, pero la sal es significativamente menos sensible que la clave de cifrado; puede almacenar sal en Texto sin formato). Por lo tanto, si solo conserva las contraseñas con fines de autenticación (realizadas por su aplicación), no hay absolutamente ninguna razón para usar el cifrado; hashing haría bien. Sin embargo, puede haber casos en los que necesite poder descifrar contraseñas (por ejemplo, puede necesitar para pasar las credenciales de los usuarios a aplicaciones de terceros). Este es el único caso en el que el uso del cifrado estaría justificado para el almacenamiento de contraseñas.

Cuestiones relacionadas