Full disclosure: sono uno degli autori del documento.
Un sistema di controllo della password esatto memorizza uno standard salato,
hash lento da calcolare della password. Quando una password, come
password123, è registrato con il servizio di autenticazione, un sale casuale
"sa" è selezionato (questo dovrebbe essere 16 o più byte casuali) e a
viene applicata la funzione hash a calcolo lento H: sa (password123). Il risultato,
chiamalo h, è memorizzato in un database insieme a sa sale. Come menzionato,
si dovrebbe scegliere H per essere lento (10s o 100s di millisecondi per calcolare).
Le buone scelte sono argon2, scrypt o PBKDF2, opportunamente configurate.
Quando un utente in seguito tenta l'accesso, se digita la sua password l'hash
viene ricalcolato e verificato rispetto al valore memorizzato. Nell'esempio sopra,
se l'utente invia password123, si ricalcola (di nuovo lentamente)
H (sa, password123) e controlla il risultato --- corrisponde al precedente
l'h calcolata e l'accesso possono essere consentiti.
Qualsiasi deviazione nella password inviata da quella precedentemente registrata
restituisce un valore hash completamente diverso e l'accesso non riesce.
La nostra idea è semplice: se il primo controllo fallisce, il sistema può anche
applicare un numero limitato di funzioni "correttore" alla password inviata,
e quindi applicare l'algoritmo di hashing al risultato. Ad esempio potremmo
risolvere una funzione correttore tappi F_caps che prende come input una password
e restituisce la password con la maiuscola di tutte le lettere modificate:
F_caps (PASSWORD123) = password123 e F_caps (pAsSwOrD123) = PaSsWoRd123.
Potremmo anche correggere un correttore di capitalizzazione di prima lettera:
F_prima (Password123) = password123 e F_prima (pASSWORD123) = PASSWORD123.
Nota che questi sono semplici da implementare.
Quindi, per fare il controllo degli errori di battitura si dovrebbe applicare la seguente logica
una sessione saltata in precedenza, una coppia di hash (sa, h) e una password inserita pw
Se H (sa, pw) = h o H (sa, F_caps (pw)) = h o H (sa, F_prima (pw)) = h allora
consentire l'accesso
Ad esempio, se una PASSWORD123 è stata inviata, i controlli sarebbero attivi
PASSWORD123, password123 e PASSWORD123, con il secondo controllo
riuscendo.
Alcuni punti:
1) L'efficacia degli attacchi di forza bruta offline è esattamente la stessa di
prima. Perché? Perché archiviamo solo sa, h. L'attaccante, data sa, h, volontà
impara solo la password tramite un attacco a forza bruta che tenta il corretto
password, nel nostro esempio password123. Non c'è perdita di sicurezza qui come
non abbiamo cambiato il modo in cui H è calcolato.
2) C'è un cambiamento trascurabile nella sicurezza contro le supposizioni remote
attacchi. Lo dimostriamo attraverso analisi approfondite nel documento, ma bolle
giù al fatto che nel mondo reale la strategia migliore è presentare il
molto probabilmente password fino ad un certo limite (ad esempio, molti siti bloccano un
account dopo 10 tentativi falliti). I controlli extra eseguiti a causa di errori di battitura
la correzione può aiutare l'aggressore a diventare un po 'più fortunato, ma lo dimostriamo
che è essenzialmente trascurabile. Se uno è preoccupato, lo diamo
tecniche che lo riducono ulteriormente.
3) La tolleranza di battitura aumenterà l'utilizzo della CPU per il server di login (e
probabilmente carico di memoria, quando H è un hash hard di memoria come scrypt o
Argon2). Ciò è dovuto alle invocazioni extra lente di elaborazione di H. In
Praticare questo non sembra essere troppo costoso come ci si potrebbe aspettare (3x
nel nostro esempio sopra) perché comunque gli utenti sarebbero finiti
invio di nuovo dopo il rifiuto e si paga il prezzo per ogni tentativo.
4) Non suggeriamo di consentire errori di battitura arbitrari. Questo non è nemmeno possibile
attualmente, poiché richiederebbe di ricalcolare H un numero proibitivo di volte
(ricorda che è lento!), e comunque questo sarebbe insicuro. Uno deve
scegliere con cura quali errori di battitura consentire in base a un'analisi di principio. Noi
credo che i due correttori di cui sopra, caps lock e prima lettera
la capitalizzazione, sono una scelta impropria per l'implementazione sicura, oltre a ciò
inizia a diventare più sfumato.
Abbiamo aggiunto una FAQ che fornisce informazioni aggiuntive:
link