¿Se puede recuperar la contraseña de hash basada en DES si se conoce sal?

6

¿Se puede recuperar una contraseña con hash si el hashing se realiza con la función crypt basado en DES en PHP y ¿Tanto el hash como la sal son conocidos por el atacante?

Considere el siguiente ejemplo:

$salt = 'mysalt';
$pass = 'mypass';
$hashed_pass = crypt($pass, $salt);
// $hashed_pass = myDUAMR/WMo7.

Sé que John the Ripper puede romper esto, sin embargo no devolverá la contraseña, sino que devolverá una cadena que se puede usar para crear el mismo valor hash. ¿Se puede recuperar la contraseña real en el escenario dado?

    
pregunta luben 12.07.2011 - 14:05
fuente

2 respuestas

14

John the Ripper trabaja probando posibles contraseñas, muy rápidamente. No siempre romperá una cripta basada en DES, o al menos no fácilmente.

Con la función de hashing basada en DES, las contraseñas pueden tener hasta 8 caracteres, y solo se usan 7 bits para cada carácter (el bit superior se ignora). Teniendo en cuenta que un usuario puede escribir la contraseña en algún momento en un teclado, se puede suponer que hay 95 valores posibles para cada carácter (caracteres ASCII del espacio [32] a tilde [127]), por lo tanto 6704780954517121 contraseñas potenciales (eso es 1 + 95 + 95 2 + 95 3 + ... + 95 8 ). Es bastante; Enumerar todas las posibilidades en una PC llevará al menos unas pocas semanas. Pero todavía es tecnológicamente viable.

DES es una función de cifrado, pero la cripta basada en DES es no DES; la función interna se altera (por la sal, a saber), se ejecuta 25 veces y, lo que es más importante, se intercambian los roles de la clave y el mensaje. El resultado final es que el nombre "crypt" es incorrecto (aunque tradicional): ya no es una función de cifrado ; debería llamarse "hash basado en DES ". Lo que esto significa es que podría haber (y de hecho hay) dos contraseñas distintas que tienen el mismo valor (incluso si usan el mismo valor sal). Por ejemplo, esta publicación de blog muestra que con la sal " hi ", ambos " cqjmide " y " ifpqgio " tienen el mismo valor " hiH9IOyyrrl4k " (la publicación del blog afirma que esta es la primera colisión de este tipo que se conoce públicamente, lo que muestra cuán interesante es el problema, ya que no es difícil: estos son valores de 64 bits, por lo que el costo de encontrar una colisión es aproximadamente 2 32 invocaciones de crypt() ; que la primera colisión publicada apareció solo a fines de 2010, solo prueba que nadie lo intentó antes. .

(Nota: al contrario de lo que dice la publicación del blog, la posibilidad de encontrar colisiones no tiene ninguna influencia en la seguridad del sistema de hashing de contraseñas. El hash basado en DES ya no debe utilizarse más por la facilidad de producción. este tipo de colisiones, pero debido a que tiene espacios de entrada y salida demasiado pequeños, y es demasiado rápido.)

En consecuencia, solo con la sal y el hash, no hay forma de identificar "la" contraseña, porque la información simplemente no está allí. A través de la enumeración de todas las contraseñas posibles, uno puede construir la lista de contraseñas coincidentes, pero no hay manera de decir cuál es la que el usuario pensó. Sin embargo, y ese es el punto importante aquí, la máquina que usa el resultado del hash basado en DES en un sistema de verificación de contraseña tampoco puede decir: cualquier contraseña que coincida con el valor de sal y hash es una buena contraseña , tan real como cualquier otro. Si la sal y el hash son " hiH9IOyyrrl4k ", entonces se aceptan tanto " cqjmide " como " ifpqgio ": incluso si usted pensó que su contraseña era "cqjmide", todavía puedo ingresar con su nombre usando " ifpqgio "como contraseña.

Tenga en cuenta, sin embargo, que la gran mayoría de los posibles valores hash tienen una única contraseña coincidente, por lo tanto, una búsqueda exhaustiva encontrará esa contraseña y ninguna otra.

En una nota similar, ya que solo se usan los primeros ocho caracteres, puede tener una contraseña de 40 caracteres, de los cuales los últimos 32 caracteres serán totalmente ignorados por el hash basado en DES. No hay forma de recuperarlos del valor hash, ya que simplemente se eliminan y no tienen ninguna influencia en el hash calculado.

    
respondido por el Thomas Pornin 12.07.2011 - 15:08
fuente
3

Es posible que no puedas calcular todas las colisiones de una contraseña determinada (usando tu algoritmo hash), son infinitas. Si John puede darle una contraseña que coincida con el resumen de hash, teóricamente puede recuperar la contraseña real. Pero no puedes:

  1. Asegúrese de que una coincidencia encontrada sea la contraseña original
  2. Asegúrese de que encontrará la contraseña original (en caso de que se conozca) en un tiempo decente.

Lo mejor que puede hacer para encontrar la contraseña sería intentar un ataque de diccionario y suponiendo que el usuario usó una palabra de este diccionario (o las variaciones que está dispuesto a calcular). Es menos probable que encuentre dos colisiones entre dos palabras distintas del diccionario. Así que esto te daría una buena certeza de tener la contraseña original. Pero, por supuesto, esto es sólo estadísticas.

    
respondido por el M'vy 12.07.2011 - 15:00
fuente

Lea otras preguntas en las etiquetas