Diferencia entre hashing una contraseña y cifrarla


140

El más votado actual a esta pregunta dice:

Otro que no es tanto un problema de seguridad, aunque está relacionado con la seguridad, está completo y es un fracaso absoluto para detectar la diferencia entre cifrar una contraseña y cifrarla . Se encuentra más comúnmente en el código donde el programador está tratando de proporcionar una funcionalidad insegura de "Recordarme mi contraseña".

¿Qué es exactamente esta diferencia? Siempre tuve la impresión de que el hash era una forma de cifrado. ¿A qué funcionalidad insegura se refiere el póster?


Un artículo bien escrito sobre por qué no debería simplemente tener secretos / contraseñas. En su lugar, use HMAC. benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

Excelente resumen del tema en el blog de seguridad de StackExchange: security.blogoverflow.com/2011/11/…
David J. Liszewski

@ JayKumar: El artículo que vinculó es muy engañoso. Combina sales de contraseña (que se espera que sean visibles para los atacantes) con las teclas MAC (que se espera que permanezcan en secreto). El enlace de David J. Liszewski proporciona una descripción mucho más precisa.
Rufflewind

Respuestas:


222

El hash es una función unidireccional (bueno, un mapeo). Es irreversible, aplica el algoritmo hash seguro y no puede recuperar la cadena original. Lo máximo que puede hacer es generar lo que se llama "una colisión", es decir, encontrar una cadena diferente que proporcione el mismo hash. Los algoritmos hash criptográficamente seguros están diseñados para evitar la aparición de colisiones. Puede atacar un hash seguro mediante el uso de una tabla de arcoiris , que puede contrarrestar aplicando una sal al hash antes de almacenarlo.

El cifrado es una función adecuada (de dos vías). Es reversible, puede descifrar la cadena destrozada para obtener la cadena original si tiene la clave.

La funcionalidad insegura a la que se refiere es que si encripta las contraseñas, su aplicación tiene la clave almacenada en algún lugar y un atacante que obtiene acceso a su base de datos (y / o código) puede obtener las contraseñas originales al obtener la clave y el texto cifrado , mientras que con un hash es imposible.

La gente suele decir que si un cracker posee su base de datos o su código, no necesita una contraseña, por lo que la diferencia es discutible. Esto es ingenuo, porque todavía tiene el deber de proteger las contraseñas de sus usuarios, principalmente porque la mayoría de ellos usan la misma contraseña una y otra vez, exponiéndolos a un mayor riesgo al filtrar sus contraseñas.


1
Para ser claros, obtenga la seguridad deseada con el hash, debe ser un algoritmo de hash criptográficamente seguro con la propiedad específica de que no solo el hash sea no reversible, sino que también sea poco práctico desde el punto de vista informático para generar CUALQUIER otra cadena que genere el mismo hash.
Alto Jeff

11
Sí y no ... Las colisiones de hash deben ser difíciles de generar en aras de la seguridad de su propia aplicación, pero la no reversibilidad es suficiente para evitar la fuga de contraseñas.
Dave Sherohman

55
sedoso: ¿y cómo exactamente va a recuperar la contraseña original de su pésima función hash? Le sugiero que relea el comentario de Dave
Vinko Vrsalovic,

1
En todo caso, una función hash que tiene una gran cantidad de colisiones es mejor para la seguridad de las contraseñas, sin embargo, obviamente significaría que se podrían usar más contraseñas para iniciar sesión en la cuenta.
williamvicary

1
@ n00b la sal no se puede codificar porque cada elemento hash debe usar una sal separada. El punto de partida es si tanto UserA como UserB usan la contraseña "1234" si descubre la contraseña de UserA no puede decir que UserB usó la misma contraseña porque tenían diferentes sales. No es crítico para la seguridad que una sal se mantenga en secreto, la mayoría de las implementaciones simplemente concatenan la sal en el frente o en la parte posterior del blob binario que representa el hash.
Scott Chamberlain

34

El hash es una función unidireccional, lo que significa que una vez que hash una contraseña es muy difícil recuperar la contraseña original del hash. El cifrado es una función bidireccional, donde es mucho más fácil recuperar el texto original del texto cifrado.

El hash simple se puede derrotar fácilmente con un ataque de diccionario, donde un atacante solo realiza un hash previo de cada palabra en un diccionario (o cada combinación de caracteres de una cierta longitud), luego usa este nuevo diccionario para buscar contraseñas hash. El uso de una sal aleatoria única para cada contraseña almacenada hace que sea mucho más difícil para un atacante usar este método. Básicamente, tendrían que crear un nuevo diccionario único para cada valor de sal que utilice, ralentizando su ataque terriblemente.

No es seguro almacenar contraseñas utilizando un algoritmo de cifrado porque si es más fácil para el usuario o el administrador recuperar la contraseña original del texto cifrado, también es más fácil para un atacante hacer lo mismo.


12

Contraseñas cifradas vs hash

Como se muestra en la imagen de arriba, si la contraseña está encriptada, siempre es un secreto oculto donde alguien puede extraer la contraseña de texto sin formato. Sin embargo, cuando se cambia la contraseña, está relajado, ya que casi no hay ningún método para recuperar la contraseña del valor hash.


Extraído de contraseñas cifradas frente a hash: ¿cuál es mejor?

¿Es bueno el cifrado?

Las contraseñas de texto sin formato pueden cifrarse utilizando algoritmos de cifrado simétricos como DES, AES o con cualquier otro algoritmo y almacenarse dentro de la base de datos. En la autenticación (confirmando la identidad con el nombre de usuario y la contraseña), la aplicación descifrará la contraseña cifrada almacenada en la base de datos y la comparará con la contraseña proporcionada por el usuario para la igualdad. En este tipo de enfoque de manejo de contraseña, incluso si alguien tiene acceso a las tablas de la base de datos, las contraseñas no serán simplemente reutilizables. Sin embargo, también hay una mala noticia en este enfoque. Si de alguna manera alguien obtiene el algoritmo criptográfico junto con la clave utilizada por su aplicación, él / ella podrá ver todas las contraseñas de usuario almacenadas en su base de datos mediante descifrado. "Esta es la mejor opción que tengo", puede gritar un desarrollador de software, pero ¿hay una mejor manera?

Función hash criptográfica (solo unidireccional)

Sí lo hay, puede que hayas perdido el punto aquí. ¿Notó que no es necesario descifrar y comparar? Si hay un enfoque de conversión de un solo sentido donde la contraseña se puede convertir en alguna palabra convertida, pero la operación inversa (generación de contraseña a partir de la palabra convertida) es imposible. Ahora, incluso si alguien tiene acceso a la base de datos, no hay forma de que las contraseñas se reproduzcan o extraigan utilizando las palabras convertidas. En este enfoque, difícilmente habrá algunos que puedan conocer las contraseñas secretas de sus usuarios; y esto protegerá a los usuarios que usan la misma contraseña en múltiples aplicaciones. ¿Qué algoritmos se pueden usar para este enfoque?


Está bien, pero cuando inicia sesión en un servicio, su contraseña se envía en texto sin formato / encriptada, porque si se envía como un hash al servidor para comparar. un hacker podría, si conoce el hash, simplemente enviar el hash al servidor para iniciar sesión. Es por eso que las contraseñas para comparación deben enviarse cifradas al servidor, donde se descifran y se cifran. Esto es seguro ¿verdad? ¿Siempre y cuando las contraseñas nunca se almacenen en forma no almacenada durante un período prolongado y todas las ocurrencias de las contraseñas cifradas / de texto sin formato se borren de cualquier memoria cuando ya no sean necesarias?
AgentM

8

Siempre he pensado que el cifrado se puede convertir en ambos sentidos, de manera que el valor final pueda llevarlo al valor original y con Hashing no podrá volver del resultado final al valor original.


8

Los algoritmos de hash suelen ser de naturaleza criptográfica, pero la principal diferencia es que el cifrado es reversible a través del descifrado, y el hashing no lo es.

Una función de cifrado generalmente toma entrada y produce una salida cifrada que es igual o de un tamaño ligeramente mayor.

Una función de hash toma entrada y produce una salida típicamente más pequeña, típicamente de un tamaño fijo también.

Si bien no es posible tomar un resultado hash y "quitarlo" para recuperar la entrada original, normalmente puede hacer fuerza bruta para llegar a algo que produce el mismo hash.

En otras palabras, si un esquema de autenticación toma una contraseña, la codifica y la compara con una versión codificada de la contraseña requerida, es posible que no se requiera que realmente conozca la contraseña original, solo su hash, y puede usar fuerza bruta su camino hacia algo que coincida, incluso si es una contraseña diferente.

Las funciones de hash generalmente se crean para minimizar la posibilidad de colisiones y dificultar el cálculo de algo que producirá el mismo hash que otra cosa.


4

Idealmente deberías hacer ambas cosas.

Primero Hash la contraseña de paso para la seguridad unidireccional. Use una sal para mayor seguridad.

Luego, encripte el hash para defenderse de los ataques del diccionario si su base de datos de hashes de contraseña se ve comprometida.


3
¿Cifrarlo con qué? Si te criticaron tanto que llegaron a la base de datos con todas las contraseñas de tus usuarios (hash, cifradas o de otro tipo), ¿no podrían encontrar la clave para descifrarlas?
Luc

55
Esto no debería ser rechazado. Es una posibilidad que no debe descartarse tan fácilmente, que la base de datos se vea comprometida mientras que la aplicación no. Por lo tanto, cifrar el hash es una capa adicional de seguridad.
Arie

@Luc No estoy de acuerdo contigo, mi yo anterior. He visto demasiadas inyecciones SQL que no comprometieron el código de la aplicación (o los archivos de configuración) y ahora opino que agregar un secreto es útil, ya sea en forma de cifrado o en forma de pimiento, pero no debe reemplazar el hashing. Para obtener una respuesta más completa, consulte aquí: security.stackexchange.com/a/31846/10863
Luc

3

Hashing :

Es un algoritmo unidireccional y una vez hash no puede revertirse y este es su punto dulce contra el cifrado.

Cifrado

Si realizamos el cifrado, habrá una clave para hacerlo. Si se filtra esta clave, todas sus contraseñas podrían descifrarse fácilmente.

Por otro lado, incluso si su base de datos será pirateada o el administrador de su servidor tomó datos de DB y usted usó contraseñas hash, el hacker no podrá romper estas contraseñas hash. En realidad, esto sería prácticamente imposible si utilizamos hashing con sal adecuada y seguridad adicional con PBKDF2.

Si desea ver cómo debe escribir sus funciones hash, puede visitar aquí .

Hay muchos algoritmos para realizar el hash.

  1. MD5 : utiliza la función hash Algoritmo 5 de resumen de mensaje (MD5). El hash de salida es de 128 bits de longitud. El algoritmo MD5 fue diseñado por Ron Rivest a principios de la década de 1990 y actualmente no es una opción preferida.

  2. SHA1 : utiliza el hash Algoritmo de hash de seguridad (SHA1) publicado en 1995. El hash de salida tiene 160 bits de longitud. Aunque se usa más ampliamente, esta no es una opción preferida hoy en día.

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 : utilice las funciones SHA-256, SHA-384 y SHA-512 de la familia SHA-2. SHA-2 se publicó en 2001. Las longitudes hash de salida son 256, 384 y 512 bits, respectivamente, como indican los nombres de las funciones hash.


1

Por más correctas que puedan ser las otras respuestas, en el contexto en el que se encontraba la cita, el hashing es una herramienta que se puede usar para proteger la información, el cifrado es un proceso que toma información y dificulta mucho la lectura / uso de personas no autorizadas.


-9

Aquí hay una razón por la que es posible que desee usar uno sobre el otro: recuperación de contraseña.

Si solo almacena un hash de la contraseña de un usuario, no puede ofrecer una función de 'contraseña olvidada'.


16
Obviamente no leyó la respuesta aceptada lo suficientemente bien. Lea atentamente: se supone que no debe ofrecer una función de recuperación de contraseña . Se supone que debe ofrecer una función de restablecimiento de contraseña . He administrado muchos sitios web durante años, incluidos vBulletin, phpBB, e107, IPB, blogspot e incluso mi propio CMS personalizado. Como administrador, NUNCA NECESITAS tener la contraseña previamente cifrada de alguien. Simplemente no lo haces. Y tampoco deberías tenerlo. Si no está de acuerdo con lo que digo, permítame asegurarle: está equivocado.
Lakey

3
Perdón por estar MUY enojado. Simplemente veo que muchos sitios web almacenan contraseñas en texto plano y me frustra. Como nota al margen: a algunos sitios web preocupados por la seguridad les gusta hacer que los usuarios cambien sus contraseñas periódicamente. Quieren asegurarse de que la persona no cambie su contraseña de "Contraseña1" a "Contraseña2". Por lo tanto, conservan la contraseña de texto sin formato para realizar estas comparaciones en una fecha posterior. Esa no es una buena práctica. Lo que deben hacer, en ese caso, es realizar un análisis de la contraseña PRIMERO, creando un montón de contraseñas similares, hash cada una, y solo almacenar los hashes .
Lakey

77
No hay problema, me hizo volver y volver a leer la pregunta y también investigar más, así que no todo está perdido :-) No estoy seguro de lo que estaba pensando cuando escribí esa respuesta. aplausos
Philtron
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.