Quanto tempo dovrebbero essere i codici di autenticazione a 2 fattori?

16

Ho notato che molti servizi che offrono l'autenticazione a 2 fattori sono passati dall'utilizzo di quattro cifre a sei. Tuttavia, mi sembra controproducente perché le cifre sono casuali, le cifre (dovrebbero) scadere e, con sei cifre, potresti dover guardare il tuo telefono due o più volte

C'è qualche ragione per questo, al di là di ciò che sembra più sicuro? La mia preferenza sarebbe di quattro o anche tre cifre, in quanto sono più facili da ricordare e reinserire.

    
posta Max Savin 21.08.2017 - 20:49
fonte

2 risposte

19

Sì, c'è un motivo: ridurre gli attacchi di forza bruta contro attacchi multipli.

Tutte le implementazioni 2FA includono un componente online che impone un numero limitato di tentativi, assicurando che l'account venga bloccato molto prima che un utente malintenzionato possa tentare tutti i possibili passcode. La lunghezza del codice di accesso 2FA stabilisce la probabilità che un attore malintenzionato indovina l'autenticazione nel numero specificato di tentativi consentiti. Ad esempio, se il codice di accesso 2FA è lungo 3 cifre e ti vengono assegnati 3 tentativi per inserirlo, le probabilità di indovinarlo casualmente sono 3/1000, o 0,33%. Se il codice di accesso 2FA è lungo 4 cifre, le probabilità scendono a 3/10000 o 0,033%.

Sebbene questa sia certamente una bassa probabilità che indovinerà il tuo passcode specifico, immagina un utente malintenzionato con un database di 10.000 account sottratto da qualche server. Attaccando solo un account utente, ha solo una probabilità dello 0,33% di indovinarlo, ma dopo aver indovinato tre volte ciascuno su 509 account diversi, la probabilità che ne indovina uno è 0.5 o 50%. Nel momento in cui ha bloccato 2.009 account, la probabilità che abbia indovinato almeno un passcode valido è .99, o 99%. * Considerare che l'attacker potrebbe non aver bisogno di attaccare con successo tutti gli account per poter accedere - potrebbe averne bisogno solo uno successo per accedere al sito e stabilire un punto d'appoggio.

Tradizionalmente, l'individuazione di un attacco di forza bruta si basava sul riconoscimento dell'attaccante che provava rapidamente più richieste con uno script automatico. Un indirizzo IP responsabile di tre o dieci account bloccati in una riga potrebbe attivare un avviso. Ma i moderni attaccanti sanno che procedendo lentamente possono evitare il rilevamento; recenti attacchi avanzati hanno dimostrato questa tecnica in natura. Prendi in considerazione un utente malintenzionato che utilizza una botnet di 10.000 computer zombi. Può comandare loro di lanciare lentamente una richiesta casuale ogni pochi minuti da tutti i 10.000 indirizzi IP senza mai attivare un avviso di velocità o bloccare alcun account. È solo questione di tempo prima che ci riesca.

Poiché la rilevazione di questo attacco è praticamente impossibile, le uniche protezioni rimaste sono quelle di rendere più difficile l'attacco dell'attaccante, quindi è necessario ridurre le probabilità di indovinare correttamente un passcode. I due modi per farlo sono di aumentare la lunghezza minima di un passcode (a 6 o 8 cifre) o di ridurre il numero di tentativi di passcode non validi consentiti. Poiché la riduzione del numero di ipotesi influirebbe sull'usabilità per gli utenti legittimi, i progettisti dell'algoritmo non hanno altra scelta se non quella di aumentare la lunghezza di ciascun passcode.

* Le mie abilità matematiche non sono eccezionali, quindi questi numeri potrebbero non essere disponibili. Alcuni editor matematicamente inclinati dovrebbero sentirsi liberi di modificare questa risposta per includere la dimostrazione usando correttamente la formula di Bernoulli.

    
risposta data 21.08.2017 - 22:04
fonte
4

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.

    
risposta data 23.08.2017 - 02:17
fonte

Leggi altre domande sui tag