El enfoque genérico para un caché es mantenerlo sincronizado con la base de datos. En este momento tiene algún sistema, con RAM, que puede decidir si un nombre de usuario + contraseña es correcto o no al verificar su contenido de RAM, dejándolo pasar a la base de datos si la información no está en la RAM (o se considera demasiado antigua). de alguna manera). Si puede hacer que las actualizaciones de contraseñas se realicen de la misma manera, entonces puede asegurarse de que cada vez que se cambie una contraseña, el contenido de la RAM esté actualizado; una implementación simple se vería así:
-
El caché de RAM contiene tuplas ( usuario , contraseña , ok , age ) donde " ok "es un valor booleano (" true "para: coincidencia de usuario + contraseña," false "para una discrepancia conocida), y" age "es la fecha en la que la información se utilizó por última vez.
-
Cuando se realiza un intento de inicio de sesión para el usuario "Bob" y la contraseña "p @ ssw0rd1":
- Si la memoria caché RAM contiene un triplete ("Bob", "p @ ssw0rd1", z , age ), actualice age a la fecha y hora actuales, y devolver z ("verdadero" en el éxito de la autenticación, "falso" en el fallo de la autenticación)
- De lo contrario, realice la verificación con el valor de hash almacenado en la base de datos, obteniendo el resultado z ("true" o "false"); almacene ("Bob", "p @ assw0rd1", z , now ) en el caché y devuelva z .
-
Cuando el usuario "Bob" cambie su contraseña, elimine todas las tuplas ("Bob", *, *, *) de la caché.
-
El caché tiene un tamaño limitado. Si la memoria caché está llena y desea insertar una tupla nueva, elimine la más antigua (aquella para la que el campo " age " está más lejos en el pasado). Esto se denomina almacenamiento en caché LRU (como en "Últimamente utilizado recientemente").
No hay una razón específica para tratar los golpes positivos y negativos de manera diferente; O bien contiene una información interesante. Tenga en cuenta que no hay necesidad de un límite de tiempo aquí; Siempre que la memoria caché se actualice (o simplemente se vacíe) cuando hay un cambio de contraseña, no hay ningún problema en mantener las entradas de la memoria caché por un tiempo arbitrario.
Si no puede actualizar la memoria caché tras los cambios de contraseña, entonces debe establecer un tiempo de espera corto para que la información almacenada en la memoria caché no se use si es más antigua que, por ejemplo, 20 segundos (como prevé). De nuevo, los golpes positivos y negativos no necesitan ser manejados de manera diferente; de hecho, se puede argumentar que el almacenamiento en caché de los impactos negativos (desajuste de usuario + contraseña) es necesariamente seguro ya que, en el peor de los casos, mantiene a los usuarios fuera; El almacenamiento en caché de aciertos positivos puede, por otro lado, permitir la entrada de personas con una contraseña que se ha invalidado (aunque con un tiempo de espera de 20 segundos, la ventana de vulnerabilidad es bastante pequeña).
Resumen: el almacenamiento en caché de fallos de autenticación es bueno, porque es a prueba de fallos (no otorgará entrada cuando no debería). Sin embargo, tenga en cuenta que no frustrará DDoS: un atacante DDoS simplemente enviará muchas solicitudes con contraseñas aleatorias, es decir, solicitudes que nunca están en el caché en ningún caso. Los errores de autenticación del almacenamiento en caché ayudan contra DDoS involuntario , cuando un usuario ha ingresado la contraseña incorrecta pero no la comprende, y hace clic en "actualizar" repetidamente.