it-swarm.dev

Come può un sistema imporre un numero minimo di caratteri modificati nelle password, senza archiviare o elaborare vecchie password in chiaro?

In alcuni ambienti, è necessario che gli utenti cambino un determinato numero di caratteri ogni volta che creano una nuova password. Ciò naturalmente impedisce che le password possano essere facilmente indovinabili, in particolare con la conoscenza delle vecchie password che un dipendente in partenza potrebbe avere per un account di servizio condiviso.

Ho separatodomande aperto per affrontare il lato pulsante di questa applicazione. Tuttavia, sono anche curioso di sapere come funziona questa applicazione sul back-end. Se una password in chiaro non può essere derivata da un forte algoritmo di hashing, in che modo il sistema determina quanti caratteri sono stati modificati in nuove password?

52
Iszi

Non sono sicuro di confrontarmi con tutte le password che l'utente ha usato in precedenza, poiché dipende davvero dal sistema di hashing che stai usando e direi che se è possibile derivare qualche somiglianza dall'hash, allora non è un ottimo sistema per iniziare con.

Ma supponendo che l'utente debba fornire la propria password corrente durante l'impostazione della nuova password, si potrebbe almeno verificare quella nuova rispetto a quella corrente poiché in quel momento si avrà entrambe le opzioni come non cancellate.

Il pam_cracklib il modulo su Linux controlla le password in questo modo e fa alcuni controlli di base per impostazione predefinita.

  • La nuova password è solo la vecchia password con le lettere invertite ("password" vs. "drowssap") o ruotate ("password" vs. "asswordp")?
  • La nuova password differisce solo da quella precedente a causa della modifica del caso ("password" vs. "Password")?
  • Almeno un numero minimo di caratteri nella nuova password non è presente nella vecchia password? È qui che entra in gioco il parametro "difok".

Puoi trovare qualche dettaglio in più qui .

47
Mark Davidson

Questo viene fatto facilmente al cambio della password (dove l'utente è e dovrebbe essere chiesto di fornire sia la vecchia che la nuova password).

27
frankodwyer

Di solito, quando si cambia la password, è necessario inserire prima la vecchia password. Questo è utile per la sicurezza, per garantire che qualcuno che cammina vicino al tuo computer non possa cambiare rapidamente la password e bloccarti mentre giri le spalle. Inoltre, consente al server di imporre regole sulla distanza della password. Il server deve solo conservare la vecchia password in memoria per tutto il tempo necessario per verificare che la nuova password sia sufficientemente diversa da quella precedente. Non è mai necessario archiviare la password non cancellata.

A proposito, tali regole di modifica della password sono dannose per la sicurezza. (Sì, lo so che sei la vittima qui.) Se gli utenti devono cambiare spesso la password, sceglieranno una password che è molto facile da ricordare o la scriveranno in un luogo facilmente accessibile. Esistono pochi vantaggi nella scadenza della password e la perdita attesa della forza della password causando agli utenti di cambiare la password ogni pochi mesi più che compensare tali vantaggi. Per un trattamento più approfondito della scadenza della password, vedere In che modo la modifica della password ogni 90 giorni aumenta la sicurezza? e È utile forzare gli utenti a cambiare le password? e È necessario cambiare regolarmente la password ma memorizzare le password precedenti?

L'utente deve inserire sia la vecchia che la nuova password per una modifica della password. Pertanto, il confronto tra la nuova password e quella precedente può essere facilmente eseguito poiché l'utente fornisce la versione in testo normale.

Per confrontare la nuova password con le password precedenti (diversa da quella corrente), il controllo può essere effettuato solo confrontando i risultati hash. Qualsiasi metodo che consentirebbe qualsiasi altro confronto sarebbe una falla di sicurezza.

5
Jacco

Di solito, quando si cambia la password, è necessario inserire prima la vecchia password. Questo è utile per la sicurezza, per garantire che qualcuno che cammina vicino al tuo computer non possa cambiare rapidamente la password e bloccarti mentre giri le spalle. Inoltre, consente al server di imporre regole sulla distanza della password. Il server deve solo conservare la vecchia password in memoria per tutto il tempo necessario per verificare che la nuova password sia sufficientemente diversa da quella precedente. Non ha mai bisogno di memorizzare la password non cancellata e può cancellare il vecchio hash non appena ha memorizzato la nuova.

Se il server verifica l'uguaglianza con password più vecchie, non solo l'ultima, è una storia diversa. È 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 confronta con il vecchio valore di hash. Su un sistema correttamente configurato, ciò 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 corretti, deve provare le varianti della 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 diffidente sul fatto che potrebbero archiviare password con hash errato.

Esiste un altro approccio per la somiglianza, che consiste nel memorizzare l'hash di ogni variazione della password, ognuna salata in modo indipendente, non appena viene impostata la password. Ma questo non ti compra molto: il server deve ancora calcolare l'hash della nuova password con tutti questi sali, il che richiede ancora molto tempo, troppo tempo per una tipica modifica della password.

Un modo per recuperare vecchie password che funzionano davvero, ma che non ho mai visto implementato da nessuna parte, è 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:

  • Deriva una chiave simmetrica dalla nuova password (usando un algoritmo di rafforzamento della chiave).
  • Deriva una chiave dalla vecchia password allo stesso modo.
  • Decifrare l'elenco di 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 di vecchie password con la nuova chiave.
  • Modificare la password e l'elenco crittografato delle password precedenti nel database.

Ciò è alquanto rischioso perché se la password corrente è compromessa, vengono esposte anche tutte le password precedenti. Ma consente di applicare una politica di distanza password a qualsiasi numero di password precedenti con un ragionevole sforzo di calcolo.

Può essere fatto solo mantenendo gli hash, potrebbe anche essere fatto su diverse iterazioni.

Il metodo sarebbe quello di prendere la password e iterarla attraverso l'algoritmo di hashing e verificare i confronti con i valori memorizzati.

Ad esempio, la maggior parte degli utenti (e la gente del service desk ama ripiegare su questo come ultima risorsa con tipi di rabbia importanti) ripeterà le loro password in modo incredibilmente semplice.

Quindi prendere la password: # foob @ r1 e renderlo # foob @ r2 che probabilmente vedrai può essere testato senza la conoscenza di # foob @ r1 eseguendo rapidamente una forza bruta sull'algo. Con la moderna potenza di elaborazione è possibile scorrere i primi 4 caratteri in meno di dieci secondi.

Sebbene per motivi di efficienza gli ultimi quattro siano in genere quelli che le persone cambiano, quindi è probabile che tu veda un botto più grande per il tuo dollaro lì. Se hai intenzione di fare non consecutivi e consecutivi stai aspettando una grande attesa per l'utente finale e un grosso pezzo di processore.

5
Ori