Di solito, quando cambi la tua password, devi prima inserire la vecchia password. Questo è utile per la sicurezza, per garantire che qualcuno che cammina vicino al tuo computer non possa modificare molto rapidamente la password e bloccarti mentre la schiena è girata. Consente inoltre al server di imporre regole sulla distanza della password. Il server deve solo conservare la vecchia password in memoria per tutto il tempo necessario a verificare che la nuova password sia sufficientemente diversa da quella precedente. Non ha mai bisogno di memorizzare la password unshed e può cancellare il vecchio hash non appena ha memorizzato quello nuovo.
Se il server controlla l'uguaglianza con le password più vecchie, non solo l'ultima, questa è una storia diversa. È abbastanza facile controllare il riutilizzo della password con hash vecchi: per ogni hash precedente, calcola l'hash della nuova password con il vecchio salt e confronta con il vecchio valore hash. Su un sistema configurato correttamente, questo dovrebbe richiedere alcuni secondi.
È diverso se il server sta controllando la somiglianza con le password più vecchie e non solo l'uguaglianza con le password più vecchie più la somiglianza con quella precedente. Se il server sta usando gli hash appropriati, allora deve provare le varianti sulla nuova password e hash ogni variazione con tutti i vecchi sali. Ciò potrebbe richiedere minuti o più con un numero non trascurabile di variazioni. Quindi, se il server si lamenta della somiglianza con una password precedente, sarei cauto sul fatto che stiano memorizzando password con hash errate.
Esiste un altro approccio per la somiglianza, che consiste nel memorizzare l'hash di ogni variazione di password, ognuna indipendentemente salata, non appena viene impostata la password. Ma questo non ti compra molto: il server ha ancora bisogno di calcolare l'hash della nuova password con tutti questi sali, che richiede ancora molto tempo, troppo a lungo per una tipica modifica della password.
Un modo per recuperare vecchie password che effettivamente funziona, ma che non ho mai visto implementato ovunque, è quello di fare quanto segue su una modifica della password, dopo aver richiesto all'utente la vecchia password e prima di cancellare la vecchia password dalla memoria:
- Ricava una chiave simmetrica dalla nuova password (utilizzando un algoritmo di rafforzamento della chiave).
- Ricava una chiave dalla vecchia password allo stesso modo.
- Decrittografa l'elenco delle vecchie password con la vecchia chiave.
- Aggiungi la precedente password all'elenco.
- Esegui i controlli di politica - tutte le password precedenti sono conosciute a questo punto. Se la nuova password supera i controlli ...
- Cripta l'elenco delle vecchie password con la nuova chiave.
- Modifica la password e l'elenco crittografato delle password precedenti del database.
Questo è un po 'rischioso perché se la password corrente è compromessa, anche tutte le password precedenti sono esposte. Ma consente di applicare una politica di distanza della password a un numero qualsiasi di password precedenti con uno sforzo di calcolo ragionevole.