Cómo prevenir ataques de tiempo en un sistema de autenticación de usuario

Un ataque de sincronización funciona mediante el análisis estadístico de cuánto tiempo tarda su programa en aceptar una clave de autenticación determinada.

Por ejemplo, es posible que haya notado que una contraseña correcta generalmente tarda menos tiempo en procesarse para cierta aplicación, mientras que una entrada de contraseña incorrecta puede tardar un poco más. (Tenga en cuenta que lo contrario también podría ser cierto)

Usando la información, un atacante podría detectar lentamente la clave de autenticación correcta para un sistema a través de un método repetido de prueba y error, combinado con análisis estadístico.

Al saber cómo funciona, podemos prevenir un ataque de tiempo. Aquí hay un pseudocódigo simple para ilustrar lo anterior:

def is_pwd_correct(password, user_name): user_password = database.get_pwd(user_name) for index,value in enumerate(password): if user_password[index] != value: # a wrong value in a password causes the loop to be returned # early. This allows for a timing attack to occur. return False return True 

Para evitar un ataque de tiempo, simplemente podemos hacer que la comparación sea una comparación de tiempo constante. Ya sea utilizando una función de temporizador o no regresando prematuramente en una comparación incorrecta.

Para más lecturas,
Ataques de tiempo en aplicaciones web
Una lección sobre ataques de tiempo (o, no use MessageDigest.isEquals)

Agregue un retraso aleatorio en el tiempo de respuesta para obtener los tiempos de respuesta promedio correctos e incorrectos aproximadamente al mismo tiempo.