La risposta di John Deters spiega perché usare più cifre per i codici 2FA è una buona cosa, ma non ha mostrato la matematica. Inoltre, invita i lettori a controllare i suoi calcoli, e penso che ci siano alcuni errori. Volevo fare una modifica, ma ho capito che sarebbe stato troppo lungo. Quindi sto postando questo come una risposta separata; se vi è consenso sul fatto che i miei calcoli sono corretti, possiamo modificare la sua risposta (oppure può farlo da solo).
L'obiettivo è calcolare quanti tentativi un utente malintenzionato deve indovinare un codice 2FA di una determinata lunghezza. L'attaccante ha successo se, facendo diversi tentativi, può indovinarne almeno uno. "Almeno 1" è difficile da calcolare direttamente, quindi usiamo un trucco:
P(at least one code is guessed) = 1 - P(no codes are guessed)
Ora, dalla formula binomiale , la probabilità di ottenere esattamente k=0
successi in n
prove è semplicemente
(1-p)^n
così
P(at least one code is guessed) = 1 - (1-p)^n
Quindi, per un dato p=3/1000
(3 tentativi prima che l'account sia bloccato, dove il numero totale possibile di codici a 3 cifre è 1000), qual è il numero di tentativi n
che un utente malintenzionato deve avere una probabilità di successo superiore al 50%?
P(at least one code is guessed) > 50%
1 - (1-p)^n > 50%
(1-p)^n < (1 - 50%)
(Lo lascio come 1 - 50%
, invece di rimpiazzarlo con il risultato 1/2, perché alla fine ripeteremo il calcolo per avere una probabilità del 99%, e in tal caso lo voglio per essere chiari che non dobbiamo scrivere 0.99, ma piuttosto 0.01 Avrei potuto lasciare una variabile lì, come desired_success_probability , ma pensavo che sarebbe stato meno leggibile)
Ora, per estrarre n
, prendiamo il logaritmo in base (1-p) di entrambi i membri. Poiché la base è inferiore a 1 e la funzione logaritmica a una base inferiore a 1 è monotonicamente decrescente , abbiamo per inverti la disuguaglianza , quindi otteniamo:
n > log (1-p) (1 - 50%)
e da modifica della base a una comoda (ad esempio 10 o e
-
tutto va bene, a patto che la calcolatrice lo supporti) abbiamo la soluzione:
n > log(1-50%) / log(1-p)
che per p = 3/1000 è
n > 230.7, that is, n >= 231.
Quindi se la probabilità di indovinare un codice è 3/1000, dopo 231 tentativi, supponiamo che almeno uno sia più probabile che indovinare nessuno.
Se, invece di avere una probabilità di successo del 50%, l'attaccante vuole raggiungere il 99%, ha bisogno di
n > log(1-99%) / log(1-p)
che significa
n > 1532.75, that is, n >= 1533
E se l'attaccante può effettuare 3 tentativi per account prima che venga bloccato, vuol dire che ha solo 77 account nel suo database rubato per avere una probabilità superiore al 50% di penetrare in uno, o 511 per avere più di 99%.
Cosa succede se il codice 2FA è, invece, lungo 6 cifre? La probabilità di successo per un singolo tentativo diventa p = 3/1,000,000
, il che significa che l'attaccante ha bisogno di almeno 231.049 tentativi (77017 account) per avere il 50% di possibilità di successo. Se vuole avere una probabilità del 99% di successo, ha bisogno di 1.535.055 tentativi (511.685 account).
In breve, aggiungendo 3 cifre stiamo aumentando il numero di possibili codici per un fattore di 1000, e per mantenere la stessa probabilità di successo l'attaccante ha bisogno di fare un po 'più di 1000 volte il numero di tentativi. Se questi sono conti bancari online, vale la pena spendere 1-2 secondi in più per inserire il codice al fine di rendere la vita di un ladro 1000 volte più difficile? A mio parere, assolutamente.