Mucha gente dice "para detener tablas de arcoiris" sin explicar qué tablas de arcoíris hacen o por qué esto los detiene.
Las tablas Rainbow son una forma inteligente de predefinir una gran cantidad de hashes y almacenarlos en menos memoria de lo que sería necesario, y puede usarlos para invertir rápidamente un hash. Las tablas para funciones simples como hash = md5(password)
y hash = sha1(password)
son comunes.
Sin embargo, se pueden generar para CUALQUIER función hash que se puede describir como output = f(input)
. Si utiliza una sal para todo el sitio para todas las contraseñas de usuario, por ejemplo hash = md5(salt+password)
, puede construir una función f
, f(password) = md5(salt+password)
. Por lo tanto, podría generar tablas rainbow para esta función, lo que llevaría mucho tiempo, pero luego le permitiría descifrar cada contraseña en la base de datos con gran rapidez.
Si la sal es diferente para cada contraseña, no puede generar una tabla de arcoiris que descifrará todas las contraseñas en la base de datos. Podrías generar uno nuevo para cada usuario, pero eso sería inútil: la fuerza bruta ingenua no sería más lenta. Por lo tanto, tener una sal separada para cada usuario detiene el ataque de las tablas del arco iris.
Hay varias maneras de lograr esto.formas populares incluyen:
- Una sal separada para cada usuario, almacenado junto con sus otros detalles en la base de datos:
hash = hashfunction(salt + password)
- Una sal global y un valor único para cada usuario:
hash = hashfunction(salt + password + user_id)
por ejemplo
- Una sal global y una sal por usuario:
hash = hashfunction(global_salt + user_salt + password)
Tener una sal global podría añadir un poco de complejidad adicional al agrietamiento las contraseñas, ya que podría ser almacenado fuera de la base de datos (en el código, por ejemplo) que los atacantes no pueden ganar el acceso a los en el caso de una violación de la base de datos. Criptográficamente, no creo que agregue mucho, pero en la práctica podría retrasarlos.
Por último, para responder a su pregunta fue:
Almacenamiento de la sal junto con los datos de usuario no debilita el hash. Las funciones hash son unidireccionales: dado el hash de una contraseña, incluso una sin sal, es muy difícil encontrar esa contraseña. La motivación detrás de la salazón no es hacer un hash individual más seguro, sino hacer que la recolección de hashes múltiples sea más segura. Existen varios vectores de ataque para una colección de hashes sin sal:
- tablas Rainbow
- contraseñas hashing comunes (
123
, password
, god
) y ver si existen en la base de datos, y luego poner en peligro las cuentas
- Buscar hash idénticos en la base de datos, lo que significa contraseñas idénticas (probablemente)
http://stackoverflow.com/questions/213380/the-necessity-of-hiding-the-salt-for-a-hash/215165#215165 – tanascius