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?
Respuestas:
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.
fuente
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.
fuente
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?
fuente
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.
fuente
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.
fuente
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.
fuente
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.
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.
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.
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.
fuente
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.
fuente
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'.
fuente