No, no es posible revertir una función hash como MD5: dado el valor hash de salida, es imposible encontrar el mensaje de entrada a menos que se conozca suficiente información sobre el mensaje de entrada.
El descifrado no es una función definida para una función hash; el cifrado y descifrado son funciones de un cifrado como AES en modo CBC; las funciones hash no cifran ni descifran . Las funciones hash se utilizan para digerir un mensaje de entrada. Como su nombre lo indica, no hay un algoritmo inverso posible por diseño .
MD5 ha sido diseñado como una función de hash unidireccional criptográficamente segura . Ahora es fácil generar colisiones para MD5, incluso si una gran parte del mensaje de entrada está predeterminado. Por lo tanto, MD5 está oficialmente roto y MD5 ya no debe considerarse un hash criptográficamente seguro. Sin embargo, todavía es imposible encontrar un mensaje de entrada que conduzca a un valor hash: encuentre X cuando solo se conoce H (X) (y X no tiene una estructura precalculada con al menos un bloque de 128 bytes de datos precalculados) . No se conocen ataques previos a la imagen contra MD5.
Por lo general, también es posible adivinar las contraseñas utilizando la fuerza bruta o los ataques de diccionario (aumentados), comparar bases de datos o tratar de encontrar hashes de contraseñas en las llamadas tablas de arco iris. Si se encuentra una coincidencia, entonces es computacionalmente seguro que se ha encontrado la entrada. Las funciones hash también son seguros contra los ataques de colisión: la búsqueda de X'
modo que H(X') = H(X)
dada H(X)
. Entonces, si X
se encuentra un archivo, es computacionalmente seguro que efectivamente fue el mensaje de entrada. De lo contrario, habría realizado un ataque de colisión después de todo. Las tablas de arco iris se pueden usar para acelerar los ataques y hay recursos especializados de Internet que lo ayudarán a encontrar una contraseña dada un hash específico.
Por supuesto, es posible reutilizar el valor hashH(X)
para verificar las contraseñas que se generaron en otros sistemas. Lo único que tiene que hacer el sistema receptor es almacenar el resultado de una función determinista F
que toma H(X)
como entrada. Cuando X
se le da al sistema, entonces, H(X)
por F
lo tanto, se puede volver a calcular y se pueden comparar los resultados. En otras palabras, no es necesario descifrar el valor hash para verificar que una contraseña sea correcta, y aún puede almacenar el hash como un valor diferente.
En lugar de MD5, es importante utilizar un hash de contraseña o PBKDF (función de derivación de clave basada en contraseña). Tal función especifica cómo usar una sal junto con un hash. De esa manera, no se generarán hashes idénticos para contraseñas idénticas (de otros usuarios o dentro de otras bases de datos). Los hash de contraseñas por ese motivo tampoco permiten que se usen tablas arcoíris siempre que la sal sea lo suficientemente grande y esté correctamente aleatorizada.
Los hashes de contraseña también contienen un factor de trabajo (a veces configurado usando un recuento de iteraciones ) que puede ralentizar significativamente los ataques que intentan encontrar la contraseña dado el valor de sal y hash. Esto es importante ya que la base de datos con sales y valores hash podría ser robada. Finalmente, el hash de la contraseña también puede ser difícil de memoria, por lo que se requiere una cantidad significativa de memoria para calcular el hash. Esto hace que sea imposible usar hardware especial (GPU, ASIC, FPGA, etc.) para permitir que un atacante acelere la búsqueda. Otras entradas u opciones de configuración como un pimiento o la cantidad de paralelización también pueden estar disponibles para un hash de contraseña.
Sin embargo, todavía permitirá que cualquiera verifique una contraseña dada, H(X)
incluso si H(X)
es un hash de contraseña. Los valores hash de las contraseñas siguen siendo deterministas, por lo que si alguien conoce todas las entradas y el algoritmo hash en sí mismo, X
puede usarse para calcular H(X)
y, nuevamente, los resultados pueden compararse.
Los hashes de contraseñas más utilizados son bcrypt , scrypt y PBKDF2 . También hay Argon2 en varias formas, que es el ganador de la competencia de hashing de contraseñas razonablemente reciente. Aquí en CrackStation hay una buena publicación de blog sobre cómo hacer la seguridad de contraseña correctamente.
Es posible hacer que sea imposible para los adversarios realizar el cálculo de hash y verificar que la contraseña sea correcta. Para esto, se puede usar un pepper como entrada para el hash de contraseña. Alternativamente, el valor hash puede encriptarse, por supuesto, utilizando un cifrado como AES y un modo de operación como CBC o GCM. Sin embargo, esto requiere el almacenamiento de un secreto / clave de forma independiente y con requisitos de acceso más altos que el hash de contraseña.