Numero massimo di tentativi per il codice 2FA?

1

Sto costruendo un sito Web e sto implementando l'autenticazione a due fattori (2FA). Il secondo fattore sarà un codice casuale a 6 cifre come quelli di Authy. Questo sito memorizzerà informazioni molto riservate.

Sto considerando di limitare la quantità di tentativi che un utente ottiene per riempire il proprio codice 2FA prima di bloccarli. Questo per prevenire la forza bruta. Ma quale quantità di tentativi è ragionevole? O dovrebbe esserci un blocco temporaneo, dato che i codici 2FA ruotano e l'attaccante non ne ricava nulla?

    
posta Eelke 16.05.2018 - 15:43
fonte

1 risposta

7

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.

    
risposta data 16.05.2018 - 17:11
fonte

Leggi altre domande sui tag