Molte persone pensano erroneamente che, poiché il codice ruota spesso, è al sicuro dalla forza bruta. Questo non è il caso. Se assumiamo 100 tentativi al secondo e un codice che è valido per 30 secondi, un utente malintenzionato ha 100*30 = 3000
indovina prima che il codice giri, questo ha una probabilità di successo 3000 / 10^6 = 0.3%
. Questo può sembrare basso, ma è solo per 30 secondi, un attaccante può riprovare per i codici successivi. Per una probabilità del 50% di successo, devono solo provare per ln(50%) / ln(99.7%) = 230.7
30 secondi o circa 2 ore.
Se non sei sicuro del motivo per cui i codici rotanti non risolvono questo problema, prova a pensarlo in questo modo: un utente malintenzionato può indovinare l'intervallo da 000000 a 002999 per ciascun codice e un codice ha una 3000 / 1000000 = 0.3%
di possibilità di essere in tale intervallo, quindi dopo aver generato molti codici ci sono buone possibilità che uno possa eventualmente rientrare in tale intervallo.
Se valuti i tentativi di limitazione a 1 ogni 5 secondi, diventa ln(50%) / ln(99.9994%)
30 secondi periodi, circa 40 giorni. Questo potrebbe non essere abbastanza buono per un account di alto valore, quindi consiglierei sicuramente ulteriori misure per prevenire la forza bruta. Ciò che queste misure dovrebbero essere, però, è più difficile da rispondere, come affermato nei commenti che bloccano completamente un account a causa di tentativi falliti di secondo fattore potrebbero consentire il DoS, e in generale potrebbero essere frustranti per gli utenti. Potrebbe essere sufficiente registrare ogni tentativo e avvisare l'utente di cambiare la password se passa un certo numero di tentativi al minuto per il giorno passato o giù di lì.
The Math
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
Se hai s
di probabilità di successo, allora hai 1 - s
di possibilità di errore. Se provi più volte, puoi moltiplicare la possibilità di fallimento per ogni tentativo di ottenere la possibilità totale di fallire, quindi (1 - s)^3
è la possibilità di fallire con 3 tentativi e 1 - (1 - s)^3
è la possibilità di avere successo in almeno 1 tentativo di 3 tentativi. Questo ci consente di ottenere la seguente equazione:
t = 1 - (1 - s)^n
Quindi possiamo risolvere per n
dato s
e 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)
Quindi per t = 0.5
e s = 0.003
:
n = ln(1 - 0.5) / ln(1 - 0.003)
= ln(0.5) / ln(0.997)
≈ 230.7
Se vuoi sapere quanto tempo ci vuole un attaccante per avere una probabilità del 99% di successo con 6 tentativi per periodo (1 ogni 5 secondi), s = 6/1000000 = 0.000006
e t = 0.99
, dando circa 767.526 periodi o 266,5 giorni . Per una probabilità dell'1% alla stessa percentuale t = 0.01
, che fornisce circa 1675 periodi o 14 ore.