¿Cuál es el punto de robar contraseñas hash?
Supongamos que robo una contraseña con hash, puedo tomar una cadena aleatoria, hacerla y ver si las hashes coinciden. Si lo hacen, acabo de romper tu contraseña.
Por ejemplo, suponga que bajo alguna función hash obtenemos la siguiente tabla hash:
"cat" --> AA
"dog" --> AB
"elephant" --> AC
...
Si robo una base de datos de contraseñas y veo que su contraseña con hash es AB
, entonces sé que la contraseña de texto sin formato es "perro". (técnicamente, más de una cadena se convertirá en "AB", pero dado que el servidor está comparando hashes, no contraseñas sin procesar, cualquiera de ellas me dejará entrar. Así que, en efecto, su cuenta tiene varias contraseñas; cualquier cadena que tenga hashes a "AB "es una contraseña válida para su cuenta.).
Los atacantes pueden descifrar contraseñas con hash al pre-computar los hashes para un gran número de contraseñas potenciales (generalmente se obtienen combinando palabras del diccionario, o de listas de contraseñas previamente descifradas), y luego usar esto como una tabla de búsqueda para convertir hashes nuevamente en texto sin formato. contraseñas
Este tipo de ataque se conoce generalmente como Rainbow Table Attack , con explicaciones introductorias aquí y aquí .
Un problema con las tablas de arco iris es que para cubrir un número razonable de contraseñas candidatas, el tamaño de esta tabla de búsqueda aumenta a terabytes y requiere varios discos duros solo para almacenarla. Como puedes imaginar, los atacantes han desarrollado trucos sofisticados para optimizar el proceso de hash inverso, por lo que si bien la idea general de las tablas del arco iris es simple, las implementaciones reales optimizadas se complican muy rápidamente.
Vale la pena mencionar algunas de las contramedidas comunes que los administradores y desarrolladores de la base de datos usan contra los ataques de la tabla arco iris.
-
salting es el truco de agregar una cadena aleatoria ( la 'sal') a la contraseña en bruto antes de hash. Cada usuario tiene una sal única, lo que significa que, en efecto, cada usuario utiliza su propia función hash única, por lo que un atacante no puede reutilizar las tablas del arco iris y tiene que pre-calcular una tabla nueva para cada usuario.
-
Tome la contraseña y ejecútela a través de una gran cantidad de iteraciones de sal y hash de una función criptográfica hash fuerte antes de almacenarla en la base de datos (por ejemplo, 100,000 iteraciones de SHA-2), lo que la hace Mucho más caro pre-calcular las tablas del arco iris. También hace que los usuarios inicien sesión más lentamente.
-
Use una función hash que toma una clave privada (estas funciones hash se llaman HMACs ) . La idea es utilizar una clave privada conocida solo por el servidor para calcular los hashes de modo que sea imposible calcular una tabla de arco iris sin conocer la clave. El problema con esto es que cuando un atacante tiene suficiente acceso para robar una base de datos completa, generalmente también puede robar la clave privada.
En tu pregunta también mencionas el almacenamiento de contraseñas encriptadas. Esto es similar a 3. en eso, a menos que tenga una buena manera de proteger la clave de cifrado (por ejemplo, hardware dedicado como un HSM ), entonces el atacante robará la clave junto con la base de datos.