Diferencia entre cifrar una contraseña y cifrarla
El actual más votado a esta pregunta dice:
Otro problema que no es tanto un problema de seguridad, aunque sí está relacionado con la seguridad, es el fracaso total y abyecto a la hora de asimilar la diferencia entre cifrar una contraseña y cifrarla . Se encuentra más comúnmente en el código donde el programador intenta proporcionar la funcionalidad insegura "Recordarme mi contraseña".
¿Cuál 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 cartel?
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 puedes 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 mediante el uso de una tabla de arcoíris , que puedes contrarrestar aplicando sal al hash antes de almacenarlo.
El cifrado es una función adecuada (bidireccional). 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 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 tanto la clave como el texto cifrado. , mientras que con un hash es imposible.
La gente suele decir que si un cracker es dueño de su base de datos o de su código, no necesita una contraseña, por lo que la diferencia es discutible. Esto es ingenuo, porque todavía tienes el deber de proteger las contraseñas de tus 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.
El hash es una función unidireccional, lo que significa que una vez que has 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 usando un ataque de diccionario, donde un atacante simplemente realiza un hash previo de cada palabra en un diccionario (o cada combinación de caracteres hasta una cierta longitud) y luego usa este nuevo diccionario para buscar contraseñas hash. El uso de una sal aleatoria única para cada contraseña hash almacenada hace que sea mucho más difícil para un atacante utilizar este método. Básicamente necesitarían crear un nuevo diccionario único para cada valor de sal que uses, lo que ralentizaría terriblemente su ataque.
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.
Como se muestra en la imagen de arriba, si la contraseña está cifrada, siempre es un secreto oculto donde alguien puede extraer la contraseña en texto sin formato. Sin embargo, cuando la contraseña tiene un hash, está relajado ya que casi no existe ningún método para recuperar la contraseña a partir del valor hash.
Extraído de Contraseñas cifradas frente a contraseñas hash: ¿cuál es mejor?
¿Es bueno el cifrado?
Las contraseñas de texto sin formato se pueden cifrar utilizando algoritmos de cifrado simétrico 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 garantizar la igualdad. En este tipo de enfoque de manejo de contraseñas, incluso si alguien obtiene acceso a las tablas de la base de datos, las contraseñas no serán simplemente reutilizables. Sin embargo, este enfoque también tiene malas noticias. Si de alguna manera alguien obtiene el algoritmo criptográfico junto con la clave utilizada por su aplicación, 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 ¿existe una mejor manera?
Función hash criptográfica (unidireccional)
Sí, es posible que no hayas comprendido el punto aquí. ¿Notaste que no es necesario descifrar y comparar? Si existe un enfoque de conversión unidireccional en el que 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 obtiene acceso a la base de datos, no hay forma de que las contraseñas se reproduzcan o extraigan utilizando las palabras convertidas. De esta manera, es poco probable que algunos puedan conocer las contraseñas ultrasecretas de sus usuarios; y esto protegerá a los usuarios que utilicen la misma contraseña en múltiples aplicaciones. ¿Qué algoritmos se pueden utilizar para este enfoque?
Siempre he pensado que el cifrado se puede convertir en ambos sentidos, de manera que el valor final pueda llevarte al valor original y con Hashing no podrás revertir del resultado final al valor original.
Los algoritmos hash suelen ser de naturaleza criptográfica, pero la principal diferencia es que el cifrado es reversible mediante el descifrado, mientras que el hash no.
Una función de cifrado normalmente toma información y produce una salida cifrada del mismo tamaño o ligeramente mayor.
Una función hash toma información y produce una salida generalmente más pequeña, generalmente también de un tamaño fijo.
Si bien no es posible tomar un resultado hash y "eliminarlo" para recuperar la entrada original, normalmente puedes usar la fuerza bruta para llegar a algo que produzca 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 hash de la contraseña requerida, es posible que no sea necesario que conozca la contraseña original, solo su hash, y puede aplicar fuerza bruta. su camino hacia algo que coincida, incluso si es una contraseña diferente.
Las funciones 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.