security - Diferencia entre Hashing a Password y Encrypting it
language-agnostic encryption (9)
El actual votado más alto a esta pregunta dice:
Otro que no es tanto un problema de seguridad, aunque está relacionado con la seguridad, es una falla completa y abyecta para asimilar la diferencia entre codificar una contraseña y cifrarla . Más comúnmente encontrado 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 hashing era una forma de encriptación. ¿Cuál es la funcionalidad insegura a la que se refiere el póster?
Esta es una de las razones por las que desea usar una sobre la otra: 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".
Hashing 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. Puedes atacar un hash seguro usando una tabla arcoiris , que puedes contrarrestar aplicando una salt al hash antes de guardarlo.
El cifrado es una función adecuada (bidireccional). Es reversible, puedes descifrar la cuerda destrozada para obtener la cadena original si tienes la clave.
La funcionalidad insegura a la que se refiere es que si cifra 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 obteniendo 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 irrelevante. 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.
Hashing es una función unidireccional, lo que significa que una vez que hashe 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 encriptado.
El hash simple es derrotado fácilmente usando un ataque de diccionario, donde un atacante simplemente realiza un pre-hash de cada palabra en un diccionario (o cada combinación de caracteres hasta cierta longitud), luego usa este nuevo diccionario para buscar contraseñas hash. El uso de una sal aleatoria única para cada contraseña almacenada en hash hace que sea mucho más difícil para un atacante usar este método. Básicamente, necesitarían crear un nuevo diccionario único para cada valor de sal que utilizas, ralentizando terriblemente su ataque.
No es seguro almacenar contraseñas utilizando un algoritmo de encriptación porque, si es más fácil para el usuario o el administrador recuperar la contraseña original del texto encriptado, también es más fácil para un atacante hacer lo mismo.
Los algoritmos de hash son generalmente de naturaleza criptográfica, pero la principal diferencia es que el cifrado es reversible a través del descifrado, y el hash no.
Una función de encriptación generalmente toma datos de entrada y produce resultados cifrados que son iguales o ligeramente más grandes.
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 obtener un resultado de hash y "descifrarlo" para recuperar la entrada original, normalmente puedes usar tu fuerza bruta para obtener algo que produzca el mismo hash.
En otras palabras, si un esquema de autenticación toma una contraseña, la mezcla y la compara con una versión hash de la contraseña requerida, puede que no sea necesario que conozca la contraseña original, solo su hash, y puede usar la fuerza bruta tu camino a algo que coincidirá, incluso si es una contraseña diferente.
Las funciones hash normalmente se crean para minimizar la posibilidad de colisiones y dificultan simplemente calcular algo que produzca el mismo hash como otra cosa.
Por correctas que puedan ser las otras respuestas, en el contexto en que se citó, el hash es una herramienta que se puede usar para proteger la información, el cifrado es un proceso que toma información y hace que sea muy difícil de leer / usar para personas no autorizadas.
Siempre he pensado que el Cifrado se puede convertir en ambos sentidos, de forma que el valor final puede llevarlo a su valor original y con Hashing no podrá revertir desde el resultado final al valor original.
Hashing :
Es un algoritmo de un solo sentido y una vez hash no puede deshacerse y este es su punto dulce contra el cifrado.
Cifrado
Si realizamos encriptación, habrá una clave para hacer esto. Si se filtra esta clave, todas sus contraseñas podrían descifrarse fácilmente.
Por otro lado, incluso si su base de datos es pirateada o su administrador de servidor tomó datos de DB y usted usó contraseñas hash, el hacker no podrá romper estas contraseñas hash. Esto sería prácticamente imposible si usamos hashing con sal apropiada y seguridad adicional con PBKDF2.
Si desea ver cómo debe escribir sus funciones de hash, puede visitar here .
Hay muchos algoritmos para realizar hash.
MD5 : utiliza la función hash del algoritmo de resumen de mensaje 5 (MD5). El hash de salida tiene 128 bits de longitud. El algoritmo MD5 fue diseñado por Ron Rivest a principios de la década de 1990 y hoy no es una opción preferida.
SHA1 : utiliza el algoritmo hash de seguridad hash (SHA1) publicado en 1995. El hash de salida tiene 160 bits de longitud. Aunque es el más utilizado, esta no es una opción preferida en la actualidad.
HMACSHA256 , HMACSHA384 , HMACSHA512 - Use las funciones SHA-256, SHA-384 y SHA-512 de la familia SHA-2. SHA-2 se publicó en 2001. Las longitudes de hash de salida son 256, 384 y 512 bits, respectivamente, como indican los nombres de las funciones hash.
Idealmente deberías hacer ambas cosas.
Primero, ejecute la contraseña del pase para la seguridad de una vía. Use una sal para mayor seguridad.
Luego encripte el hash para defenderse de ataques de diccionario si su base de datos de hashes de contraseña está en peligro.
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 la contraseña es hash, se relaja ya que apenas hay un método para recuperar la contraseña del valor hash.
Extraído de contraseñas encriptadas vs hash: ¿cuál es mejor?
¿El cifrado es bueno?
Las contraseñas de texto simple se pueden cifrar utilizando algoritmos de cifrado simétricos como DES, AES o con cualquier otro algoritmo y se pueden almacenar dentro de la base de datos. En la autenticación (que confirma 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 garantizar la igualdad. En este tipo de enfoque de manejo de contraseñas, 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 malas noticias 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 los usuarios almacenadas en su base de datos por descifrado. "Esta es la mejor opción que tengo", un desarrollador de software puede gritar, pero ¿hay una mejor manera?
Función hash criptográfica (solo en una dirección)
Sí, hay, puede ser que se haya perdido el punto aquí. ¿Notaste que no hay ningún requisito para descifrar y comparar? Si hay un enfoque de conversión de un solo sentido donde la contraseña se puede convertir en una palabra convertida, pero la operación inversa (generación de contraseña 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. De acuerdo con este enfoque, difícilmente habrá algunos que puedan conocer las contraseñas secretas más importantes 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?