Guardar la longitud de la contraseña después del hash para minimizar el cálculo

3

Leyendo este tema ¿Qué tan crítico es? ¿Mantener en secreto la longitud de la contraseña? me viene a la mente el siguiente escenario:

Supongamos que tengo una aplicación web (PHP escrito con password_hash() ) que usa hashes de contraseña con sal para guardar las contraseñas de los usuarios. Un usuario intenta iniciar sesión ahora. El servidor ahora tiene que hacer algunas tareas:

  1. Calcule el hash de la contraseña proporcionada (por supuesto, con factores de costo)
  2. Comparar hash con hash guardado

Suponiendo que puedo guardar la longitud de una contraseña sin ningún problema de seguridad, podría cambiar el flujo de tareas:

  1. Compare la longitud de la contraseña proporcionada con la longitud guardada (no coincide con - > retorno)
  2. Si la coincidencia calcula el hash de la contraseña proporcionada (por supuesto, con factores de costo)
  3. Comparar hash con hash guardado

¿Qué piensas? ¿Sería esto "económico" porque ahorro tiempo / recursos de computación (o ralentiza el proceso en general, porque solo ahorraría tiempo si no se proporcionara una contraseña válida)? ¿O sería un problema de seguridad?

    
pregunta Danny. 26.06.2015 - 11:53
fuente

1 respuesta

7

Sí, hay un problema de seguridad. Corres el riesgo de perder inadvertidamente la longitud de las contraseñas utilizando este enfoque.

Un atacante podría abusar de esto para determinar la longitud de una contraseña usando una forma de ataque de tiempo

Dado que calcular el hash es computacionalmente más costoso que comparar la longitud de la contraseña provista con la longitud almacenada, podemos suponer que la comparación de longitud se ejecutará mucho más rápido que el cálculo y la comparación de hash y, por lo tanto, devolverá un resultado al usuario mucho más rápido (estamos hablando de milisegundos aquí, pero lo importante es que es mensurable).

Ahora, el atacante puede simplemente comenzar a enviar contraseñas de diferentes longitudes y medir el tiempo que toma obtener una respuesta (ajustando la latencia de la red y otros factores) y medir los tiempos de respuesta. Dado que el servidor tardará más en responder cuando realmente compara el hash, el atacante sabrá que la longitud de la contraseña es correcta cuando la respuesta es relativamente más lenta que en las estimaciones anteriores. Tener la longitud de la contraseña hace que sea mucho más fácil para el atacante comenzar a adivinar la contraseña correcta.

Si el cálculo en el servidor es realmente un problema para usted, puede mitigar este riesgo asegurándose de que la respuesta solo se devuelva después de un período de tiempo fijo. De esta manera, el tiempo que toma la respuesta no filtra información al atacante, ya que no tiene relación con el cálculo que se realiza en segundo plano.

Todo lo considerado, diría que los riesgos de hacer algo como esto definitivamente superan las recompensas.

    
respondido por el ilikebeets 26.06.2015 - 12:18
fuente

Lea otras preguntas en las etiquetas