¿Dónde guardas tus cadenas de sal?

Siempre utilicé una cadena de saltas por entrada correcta al crear contraseñas para el almacenamiento de la base de datos. Para mis necesidades, almacenar la sal en el DB junto a la contraseña hash siempre ha funcionado bien.

Sin embargo, algunas personas recomiendan que la sal se almacene por separado de la base de datos. Su argumento es que si la base de datos se ve comprometida, un atacante aún puede construir una tabla arco iris teniendo en cuenta una cadena de sal en particular para descifrar una cuenta a la vez. Si esta cuenta tiene privilegios de administrador, puede que ni siquiera necesite descifrar ninguna otra.

Desde una perspectiva de seguridad, ¿vale la pena almacenar sales en un lugar diferente? Considere una aplicación web con el código del servidor y DB en la misma máquina. Si las sales se almacenan en un archivo plano en esa máquina, es probable que si la base de datos está en peligro, el archivo de sales también lo será.

¿Hay alguna solución recomendada para esto?

El objective de las tablas arcoiris es que se crean con anticipación y se distribuyen en masa para ahorrar tiempo de cálculo para otros; se necesita el mismo tiempo para generar tablas de arcoiris sobre la marcha que para descifrar directamente la combinación contraseña + sal (dado que efectivamente, lo que se está haciendo cuando se generan tablas de arcoíris es ejecutar previamente los cálculos para forzar el hash), por lo tanto, el argumento de que al conocer la sal alguien podría “generar una tabla de arcoíris” es espurio.

No tiene sentido almacenar reservas en un archivo separado, siempre que estén basadas en el usuario; el objective de la solución es que una tabla arcoiris no pueda descifrar todas las contraseñas en el DB.

Proporcionaré una opinión ligeramente diferente sobre esto.

Siempre guardo la sal mezclada con el hash de contraseña salada.

Por ejemplo, colocaré la primera mitad de la sal antes del picadillo salado de la contraseña y la última mitad de la sal después del picadillo salado de la contraseña. La aplicación conoce este diseño, por lo que puede obtener estos datos y obtener el hash de sal y contraseña salada.

Mi razonamiento para este enfoque:

Si los datos de contraseña / hash se ven comprometidos y caen en manos de un atacante, el atacante no sabrá cuál es la sal al mirar los datos. De esta forma, un atacante no puede prácticamente realizar un ataque de fuerza bruta para obtener una contraseña que coincida con el hash, ya que para empezar no conoce el hash y no tiene forma de saber qué partes de los datos son partes de la sal, o partes del hash de contraseña salada (a menos que sepa la lógica de autenticación de su aplicación ).

Si el hash de contraseña salada se almacena tal como está, se puede realizar un ataque de fuerza bruta para obtener una contraseña que cuando se sala y crea hash produce los mismos datos que el hash con contraseña salada.

Sin embargo, por ejemplo, incluso si el hash con contraseña salada se almacenó tal cual, pero pre-agregado con un solo byte aleatorio, siempre que el atacante no sepa que este primer byte debe descartarse, esto también boostía la dificultad. de ataque Su aplicación sabría descartar el primer byte de los datos cuando se utiliza para autenticar a su usuario.

La conclusión de esto …

1) Nunca almacene los datos que usa su aplicación de autenticación en su forma exacta.

2) Si es posible, mantenga su lógica de autenticación en secreto para mayor seguridad.

Da un paso más …

Si no puede mantener en secreto la lógica de autenticación de su aplicación, mucha gente sabe cómo se almacenan sus datos en la base de datos. Y supongamos que ha decidido almacenar el hachís de contraseña salada mezclado junto con la sal, con algo de la sal que antepone el hash con contraseña salada y el rest de la sal que lo acompaña.

Al generar la sal aleatoria, también puede decidir al azar qué proporción de su sal va a almacenar antes / después del hash con contraseña salada.

Por ejemplo, genera una sal aleatoria de 512 bytes. Agregas la sal a tu contraseña y obtienes el hash SHA-512 de tu contraseña salada. También genera un entero aleatorio 200. Luego almacena los primeros 200 bytes de la sal, seguidos por el hash con contraseña salada, seguido del rest de la sal.

Al autenticar la entrada de contraseña de un usuario, su aplicación pasará la cadena y supondrá que el primer byte 1 de los datos es el primer 1 byte de la sal, seguido por el hash salado. Este pase fallará La aplicación continuará utilizando los primeros 2 bytes de los datos como los primeros 2 bytes de la sal, y repita hasta que se encuentre un resultado positivo después de usar los primeros 200 bytes como los primeros 200 bytes de la sal. Si la contraseña es incorrecta, la aplicación continuará probando todas las permutaciones hasta que no se encuentre ninguna.

Los pros de este enfoque:

Mayor seguridad: incluso si se conoce su lógica de autenticación, la lógica exacta es desconocida en tiempo de comstackción. Es prácticamente imposible realizar un ataque de fuerza bruta, incluso con el conocimiento de la lógica exacta. El aumento de las longitudes de sal boostá aún más la seguridad.

Los contras de este enfoque:

Dado que la lógica exacta se infiere en el tiempo de ejecución, este enfoque requiere mucha CPU. Cuanto más larga sea la longitud de la sal, más intensivo será el uso de la CPU.

Autenticar contraseñas incorrectas implicará el mayor costo de CPU. Esto puede ser contraproducente para las solicitudes legítimas, pero aumenta la seguridad contra los atacantes.

Este enfoque se puede implementar de varias maneras y se puede hacer aún más seguro mediante el uso de sales de ancho variable y / o hash de contraseña salteada.

A menudo, se anteponen al hash y se almacenan en el mismo campo.

No es necesario almacenarlos por separado: el punto es usar una sal aleatoria para cada contraseña, de modo que no se pueda usar una única tabla de arcoiris en contra de su conjunto completo de hash de contraseñas. Con sales aleatorias, un atacante debe aplicar fuerza bruta a cada hash por separado (o calcular una tabla de arcoíris para todas las sales posibles: mucho más trabajo).

Si tuviera una ubicación de almacenamiento más segura, tendría sentido almacenar allí los hashes.

Basado en el libro Developing ASP.NET MVC 4 Web Applications de William Penberthy:

  1. Tener acceso a las sales almacenadas en una base de datos separada requiere piratas informáticos para hackear dos bases de datos diferentes para obtener acceso a la sal y la contraseña salada. Almacenarlos en la misma tabla que la contraseña, o incluso en otra tabla de la misma base de datos, significa que cuando los hackers accedan a la base de datos, tendrán acceso tanto al hash de la contraseña como al de la contraseña. Como la seguridad incluye el proceso de hacer que el pirateo en el sistema sea demasiado caro o exija mucho tiempo para valer la pena, duplicar la cantidad de acceso que un hacker debería obtener debería hacer que el sistema sea más seguro.
  2. La facilidad de uso es la razón principal para mantener las sales en la misma base de datos que las contraseñas hash. No tendría que asegurarse de que dos bases de datos estén siempre disponibles al mismo tiempo y siempre sincronizadas. La ventaja de tener una sal es mínima si cada usuario tiene una sal aleatorizada porque, aunque podría facilitar el descubrimiento de la contraseña de un individuo, la cantidad de fuerza necesaria para descifrar las contraseñas del sistema en general será alta. En este nivel de discusión, esa es realmente la expectativa: proteger las contraseñas. Si los hackers han adquirido una copia de la base de datos, los datos de su aplicación ya están comprometidos. En este punto, el problema es mitigar los riesgos de los usuarios debido al potencial de las contraseñas compartidas.
  3. El requisito de mantener dos bases de datos separadas vinculadas es extenso. Por supuesto, agrega la percepción de seguridad, pero la única ventaja que brinda es que protege una contraseña, un elemento único de datos. Si todos los campos de la base de datos se encriptaran individualmente, y esta misma sal se usara para eso, tendría más sentido almacenarla por separado de los datos porque se mejora la seguridad básica de su sistema.