Muchas personas asumen falsamente que debido a que el código gira a menudo, está a salvo de la fuerza bruta. Este no es el caso. Si asumimos 100 intentos por segundo y un código que es válido durante 30 segundos, un atacante tiene 100*30 = 3000
de estimaciones antes de que gire el código, esto tiene un 3000 / 10^6 = 0.3%
de probabilidad de éxito. Esto puede parecer bajo, pero esto es solo por 30 segundos, un atacante puede intentar nuevamente los códigos subsiguientes. Para un 50% de probabilidad de éxito, solo necesitan intentarlo por períodos de ln(50%) / ln(99.7%) = 230.7
30 segundos, o aproximadamente 2 horas.
Si no está seguro de por qué los códigos rotativos no resuelven esto, intente pensar de esta manera: un atacante puede adivinar el rango de 000000 a 002999 para cada código, y un código tiene una probabilidad 3000 / 1000000 = 0.3%
de estar en ese rango, por lo tanto, después de generar muchos códigos, es muy probable que uno caiga dentro de ese rango.
Si califica los intentos de límite a 1 cada 5 segundos, se convierte en ln(50%) / ln(99.9994%)
períodos de 30 segundos, aproximadamente 40 días. Es posible que esto todavía no sea lo suficientemente bueno para una cuenta de alto valor, por lo que definitivamente recomendaría medidas adicionales para evitar la fuerza bruta. Sin embargo, lo que deberían ser estas medidas es más difícil de responder, como se indica en los comentarios, bloquear una cuenta debido a un segundo factor fallido, los intentos pueden permitir el DoS, y en general podría ser frustrante para los usuarios. Puede ser suficiente registrar cada intento y advertir al usuario que cambie su contraseña si pasa un cierto número de intentos por minuto durante el último día o más.
Las matemáticas
Let s be the chance of success for a single 30 second period
Let n be the number of 30 second periods
Let t be the total chance of success over all periods
Si tienes s
chance de éxito, entonces tienes 1 - s
chance de falla. Si lo intentas varias veces, puedes multiplicar la posibilidad de fracaso en cada intento para obtener la probabilidad total de fracaso, por lo que (1 - s)^3
es la posibilidad de fallar con 3 intentos, y 1 - (1 - s)^3
es la oportunidad de tener éxito en al menos 1 de 3 intentos. Esto nos permite llegar a la siguiente ecuación:
t = 1 - (1 - s)^n
Luego podemos resolver para n
dado s
y t
:
(1 - s)^n = 1 - t
ln( (1 - s)^n ) = ln(1 - t)
n * ln(1 - s) = ln(1 - t)
n = ln(1 - t) / ln(1 - s)
Entonces, para t = 0.5
y s = 0.003
:
n = ln(1 - 0.5) / ln(1 - 0.003)
= ln(0.5) / ln(0.997)
≈ 230.7
Si desea saber cuánto tiempo le tomaría a un atacante tener un 99% de probabilidad de éxito con 6 intentos por período (1 cada 5 segundos), s = 6/1000000 = 0.000006
y t = 0.99
, dando unos 767,526 períodos o 266.5 días . Para una probabilidad del 1% a la misma tasa t = 0.01
, lo que da aproximadamente 1675 períodos o 14 horas.