¿Cómo ayuda la sal de contraseña contra un ataque a la tabla Rainbow?

Resuelto Rich asked hace 15 años • 10 respuestas

Tengo problemas para entender el propósito de una sal en una contraseña. Tengo entendido que el uso principal es obstaculizar un ataque a la mesa arcoíris. Sin embargo, los métodos que he visto para implementar esto no parecen complicar realmente el problema.

He visto muchos tutoriales que sugieren que la sal se use de la siguiente manera:

$hash =  md5($salt.$password)

El razonamiento es que el hash ahora no se asigna a la contraseña original, sino a una combinación de la contraseña y la sal. Pero diga $salt=fooy $password=bary $hash=3858f62230ac3c915f300c664312c63f. Ahora alguien con una tabla de arcoíris podría invertir el hash y generar la entrada "foobar". Luego podrían probar todas las combinaciones de contraseñas (f, fo, foo, ... oobar, obar, bar, ar, ar). Es posible que se necesiten unos milisegundos más para obtener la contraseña, pero no mucho más.

El otro uso que he visto es en mi sistema Linux. En /etc/shadow, las contraseñas hash en realidad se almacenan con sal. Por ejemplo, una sal de "foo" y una contraseña de "bar" generarían un hash como esto: $1$foo$te5SBM.7C25fFDu6bIRbX1. Si un hacker de alguna manera pudiera conseguir este archivo, no veo para qué sirve la sal, ya que te5SBM.7C25fFDu6bIRbXse sabe que el hash inverso de contiene "foo".

Gracias por cualquier luz que alguien pueda arrojar sobre esto.

EDITAR : Gracias por la ayuda. Para resumir lo que entiendo, la sal hace que la contraseña con hash sea más compleja, por lo que es mucho menos probable que exista en una tabla de arcoíris precalculada. Lo que entendí mal antes fue que estaba asumiendo que existía una tabla de arcoíris para TODOS los hashes.

Rich avatar Jan 07 '09 22:01 Rich
Aceptado

Una sal pública no dificultará los ataques de diccionario al descifrar una sola contraseña. Como ha señalado, el atacante tiene acceso tanto a la contraseña hash como al salt, por lo que cuando ejecuta el ataque de diccionario, puede simplemente usar el salt conocido al intentar descifrar la contraseña.

Una sal pública hace dos cosas: hace que sea más lento descifrar una lista grande de contraseñas y hace que sea inviable usar una tabla arcoíris.

Para comprender el primero, imagine un archivo de contraseña única que contenga cientos de nombres de usuario y contraseñas. Sin sal, podría calcular "md5 (intento [0])" y luego escanear el archivo para ver si ese hash aparece en alguna parte. Si hay sales presentes, entonces tengo que calcular "md5(salt[a] . intent[0])", comparar con la entrada A, luego "md5(salt[b] . intent[0])", comparar con la entrada B , etc. Ahora tengo nmucho trabajo por hacer, ¿dónde nestá la cantidad de nombres de usuario y contraseñas contenidos en el archivo?

Para entender el segundo, hay que entender qué es una mesa arcoíris. Una tabla de arcoíris es una lista grande de hashes precalculados para contraseñas de uso común. Imagine nuevamente el archivo de contraseñas sin sales. Todo lo que tengo que hacer es revisar cada línea del archivo, extraer la contraseña hash y buscarla en la tabla del arco iris. Nunca tengo que calcular un solo hash. Si la búsqueda es considerablemente más rápida que la función hash (que probablemente lo sea), esto acelerará considerablemente el descifrado del archivo.

Pero si el archivo de contraseña tiene sal, entonces la tabla arcoíris tendría que contener "salt.contraseña" previamente codificado. Si la sal es suficientemente aleatoria, esto es muy poco probable. Probablemente tendré cosas como "hola" y "foobar" y "qwerty" en mi lista de contraseñas pre-hash de uso común (la tabla del arco iris), pero no voy a tener cosas como "jX95psDZhello" o "LPgB0sdgxfoobar" o "dZVUABJtqwerty" calculado previamente. Eso haría que la mesa del arcoíris fuera prohibitivamente grande.

Por lo tanto, la sal reduce al atacante a un cálculo por fila por intento, lo cual, cuando se combina con una contraseña suficientemente larga y aleatoria, es (en términos generales) indescifrable.

Ross avatar Jan 07 '2009 16:01 Ross

Las otras respuestas no parecen abordar sus malentendidos sobre el tema, así que aquí va:

Dos usos diferentes de la sal

He visto muchos tutoriales que sugieren que la sal se use de la siguiente manera:

$hash = md5($salt.$password)

[...]

El otro uso que he visto es en mi sistema Linux. En /etc/shadow, las contraseñas hash en realidad se almacenan con sal.

Siempre debe almacenar el salt con la contraseña, porque para validar lo que el usuario ingresó en su base de datos de contraseñas, debe combinar la entrada con el salt, aplicar un hash y compararlo con el hash almacenado.

Seguridad del hash

Ahora alguien con una tabla de arcoíris podría invertir el hash y generar la entrada "foobar".

[...]

ya que se sabe que el hash inverso de te5SBM.7C25fFDu6bIRbX contiene "foo".

No es posible revertir el hash como tal (al menos en teoría). El hash de "foo" y el hash de "saltfoo" no tienen nada en común. Cambiar incluso un bit en la entrada de una función hash criptográfica debería cambiar completamente la salida.

Esto significa que no puede crear una tabla de arcoíris con las contraseñas comunes y luego "actualizarla" con un poco de sal. Hay que tener en cuenta la sal desde el principio.

Ésta es la razón por la que necesitas una mesa arcoíris en primer lugar. Debido a que no puede obtener la contraseña desde el hash, calcula previamente todos los hashes de las contraseñas más probablemente utilizadas y luego compara sus hashes con sus hashes.

calidad de la sal

pero di$salt=foo

"foo" sería una elección de sal extremadamente pobre. Normalmente utilizarías un valor aleatorio, codificado en ASCII.

Además, cada contraseña tiene su propio salt, diferente (con suerte) de todos los demás salts del sistema. Esto significa que el atacante tiene que atacar cada contraseña individualmente en lugar de tener la esperanza de que uno de los hashes coincida con uno de los valores de su base de datos.

El ataque

Si un hacker de alguna manera pudiera conseguir este archivo, no veo para qué sirve la sal.

Un ataque a la tabla Rainbow siempre necesita /etc/passwd(o cualquier base de datos de contraseñas que se use), o de lo contrario, ¿cómo compararía los hash en la tabla Rainbow con los hashes de las contraseñas reales?

En cuanto al propósito: digamos que el atacante quiere crear una tabla de arcoíris para 100.000 palabras inglesas de uso común y contraseñas típicas (piense en "secreto"). Sin sal, tendría que precalcular 100.000 hashes. Incluso con la sal tradicional de UNIX de 2 caracteres (cada uno es una de 64 opciones: [a–zA–Z0–9./]), tendría que calcular y almacenar 4.096.000.000 hashes... una gran mejora.

 avatar Jan 07 '2009 17:01