Di solito, quando si modifica la password, è necessario prima inserire la vecchia password. Questo è utile per la sicurezza, per garantire che qualcuno che cammina vicino al tuo computer non possa cambiare molto rapidamente la password e bloccarti mentre giri le spalle. Consente inoltre al server di applicare le regole di distanza delle password. Il server deve solo mantenere la vecchia password in memoria per il tempo necessario a verificare che la nuova password sia sufficientemente diversa da quella vecchia. Non ha mai bisogno di memorizzare la password senza hash 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, è diverso storia. È abbastanza facile controllare il riutilizzo della password con i vecchi hash: per ogni vecchio hash, calcola l'hash della nuova password con il vecchio salt e confrontalo con il vecchio valore hash. Su un sistema configurato correttamente, questo dovrebbe richiedere alcuni secondi.
È una questione diversa se il server sta verificando 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 utilizza hash appropriati, deve provare le variazioni sulla nuova password e hash ogni variazione con tutti i vecchi sali. Ciò potrebbe richiedere minuti o più con un numero di variazioni non trascurabile. Quindi, se il server si lamenta della somiglianza con una password precedente, sarei cauto che potrebbero memorizzare password con hash errato.
Esiste un altro approccio per la somiglianza, che è memorizzare l'hash di ogni password variazione, ciascuna salata indipendentemente, non appena viene impostata la password. Ma questo non ti costa molto: il server deve ancora calcolare l'hash della nuova password con tutti questi sali, il che richiede ancora molto tempo, troppo tempo per un tipico cambio di password.
Un modo per recuperare le vecchie password che funziona davvero, ma che non ho mai visto implementato da nessuna parte, è 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:
- Deriva una chiave simmetrica dalla nuova password (utilizzando un algoritmo di rafforzamento della chiave).
- Deriva una chiave dalla vecchia password allo stesso modo.
- Decifra l'elenco delle vecchie password con la vecchia chiave.
- Aggiungi la precedente password all'elenco.
- Effettua i controlli dei criteri: tutte le password precedenti sono note a questo punto. Se la nuova password supera i controlli ...
- Crittografa l'elenco delle vecchie password con la nuova chiave.
- Cambia la password e l'elenco crittografato delle password precedenti nel database.
Questo è alquanto rischioso perché se la password corrente viene compromessa, vengono esposte anche tutte le password precedenti. Ma consente di applicare una politica di distanza delle password da un numero qualsiasi di password precedenti con uno sforzo di calcolo ragionevole.