¿La adición de datos no deseados a las contraseñas de los usuarios antes del hash afecta la seguridad?

6

He visto preguntas similares en el sitio, pero no esta exacta.

El más cercano fue Modificar las contraseñas antes de almacenar donde la respuesta aceptada se resume en indicando que la transformación de la contraseña se desperdicia en ciclos de CPU que, de lo contrario, podrían pasar por una mayor iteración en su hash real.

Si bien eso es correcto, considere el siguiente escenario:

Digamos que su aplicación usa un host para el código de la aplicación y otro host para la base de datos / almacenamiento. Es posible que, en algún momento en el futuro, su base de datos se vea comprometida, pero el código de su aplicación permanezca en secreto.

Si eso sucede, el atacante puede intentar revelar las contraseñas de los usuarios con una mezcla de fuerza bruta o listas de palabras con expresiones regulares, algo que probablemente descubra al menos algunas contraseñas, y más a medida que pase el tiempo.

Obviamente, si descubriera que su base de datos se ha comprometido, restablecería todas las contraseñas de los usuarios. Pero en el momento en que el Delta se ha comprometido realmente, y al descubrirlo, el atacante tiene un potencial vector de ataque para acceder a las cuentas vulnerables de ciertos usuarios.

¿Entonces pensé, específicamente para este escenario, que simplemente no agregaría algunos datos basura a las contraseñas de los usuarios antes de que el hashing hiciera este ataque mucho más débil? (es decir, dificulta que un atacante revele las contraseñas a tiempo antes de que descubras qué sucedió y las restableciste)

No estoy hablando de transformaciones generales, sino específicamente de agregar porque: 1. garantiza que todas las contraseñas permanezcan únicas después de la modificación, por lo que no pierden la entropía. 2. es una tarea de cálculo de costo relativamente bajo en el proceso de un servidor que acepta formularios de registro y respuestas de formato. 3. es simple, y no agrega complejidad de código que haría que la aplicación sea más difícil de mantener en el futuro.

La cadena a agregar sería una cadena constante, almacenada en un lugar en el código de la aplicación. Obviamente, si el código de la aplicación se ve comprometido, todo esto no tiene sentido. Pero si solo se comprometieron los hashes de contraseña de usuario:

  1. ¿Sería esto efectivo para frenar a un atacante? (es decir, demorar más en revelar las contraseñas de los usuarios utilizando métodos modernos)

Y, en general:

  1. ¿Esto introduciría alguna nueva vulnerabilidad en el sistema?

Ejemplo:

El servidor de aplicaciones tiene una cadena constante: "! @ # $% ^ & () ,;" User A se registra con la contraseña "secretpassword" El servidor concat los dos, creando: "! @ # $% ^ & (),; secretpassword" Luego, codifica la nueva cadena y almacena el hash resultante en la base de datos.

Para cada intento de inicio de sesión futuro, la cadena constante se agregaría al comienzo de la contraseña del usuario (en el servidor) antes de volver a calcular el hash.

Ahora digamos que tengo un millón de usuarios, y un atacante consiguió un millón de hashes de contraseña que mi aplicación usa para autenticar a los usuarios. El atacante también sabe que estoy agregando una cadena constante al comienzo de las contraseñas de usuario en el servidor, de hecho lo estoy declarando públicamente en mi GUI de registro. Sin embargo, el atacante no conoce la cadena real que estoy adjuntando.

la cuenta de User A sería más segura (es decir, le tomaría más tiempo al atacante revelar su contraseña secreta escrita "secreta" o encontrar una manera de ingresar a su cuenta y tomar posesión de sus datos) o sería ¿lo mismo? ¿algún otro User X se volvería menos seguro ahora debido a este cambio, o ningún otro usuario se vería afectado para peor?

    
pregunta Kylee 25.04.2018 - 18:47
fuente

1 respuesta

11

Lo que estás proponiendo se llama pepper . Es otro tipo de sal, pero no se almacena. Esto no ayudará mucho, ya que de acuerdo con el principio de Kerckhoffs , debe asumir que el atacante sabe todo sobre su sistema, excepto la clave. En este caso particular, suponga que el atacante puede leer cada archivo, cada registro en la base de datos y cada registro. Solo que no conoce las contraseñas del usuario.

Si su sistema está abierto para el registro, el atacante podría incluso registrarse él mismo, leer la base de datos, obtener su propia contraseña con hash y forzar la cadena secreta. Si la cadena es la misma para cada hash, tan pronto como descubre la cadena secreta de su contraseña, todos sus millones de usuarios también se verán comprometidos.

No se puede planificar la seguridad en función de algo que pierde inmediatamente toda facilidad de uso una vez que se rompe. Tan pronto como se descubre la cadena secreta, todas sus contraseñas son vulnerables y no puede simplemente cambiarlas. Tendrá que esperar a todos los usuarios para iniciar sesión, obtener las contraseñas de texto simple para cada una, cambiar la cadena secreta y volver a codificarla. Puede tomar meses o años para que todos los usuarios vuelvan a iniciar sesión. A menos que, por supuesto, vaya al modo completamente inseguro y también almacene las contraseñas de texto claro en algún lugar también.

Incrementarás la seguridad utilizando una función de hash fuerte y agregando más rondas en el proceso de hash, no agregando nada en la contraseña, hash o ambos.

    
respondido por el ThoriumBR 25.04.2018 - 18:54
fuente

Lea otras preguntas en las etiquetas