Come implementare una cronologia sicura delle password

22

Le password non dovrebbero essere archiviate in testo semplice per ovvi motivi di sicurezza: devi memorizzare gli hash, e dovresti anche generare l'hash con attenzione per evitare gli attacchi con i tavoli arcobaleno.

Tuttavia, in genere, è necessario memorizzare le ultime password n e applicare la minima complessità e il minimo cambiamento tra le diverse password (per impedire all'utente di utilizzare una sequenza come Password_1, Password_2,. .., Password_ n ). Ciò sarebbe banale con le password in testo normale, ma come puoi farlo memorizzando solo hash?

In altre parole: come è possibile implementare un meccanismo di cronologia sicura delle password?

    
posta Wizard79 27.11.2012 - 16:19
fonte

5 risposte

22

Archivia gli hash e verifica una password inserita rispetto agli hash memorizzati, allo stesso modo in cui verifichi una password durante l'accesso. Dovresti generare password "alternative" da quella data basata su modelli numerici per rilevare il tuo "minimo" modifiche.

Al momento dell'accesso, si verifica già la password inserita rispetto a un hash, non è necessario memorizzare la password in testo semplice. Lo stesso trucco funziona quando si tratta di cambiare una password, è sufficiente controllare le password inserite e "modifica minima" generate contro gli hash storici. Se la nuova password è soddisfacente, sposta l'hash della password corrente sul set storico e sostituiscilo con un nuovo hash per la nuova password.

    
risposta data 27.11.2012 - 16:20
fonte
28

Quando l'utente cambia la sua password, richiede loro di inserire la password precedente. Ora hai accesso a due password di testo normale, anche se non stai memorizzando password in testo semplice nel tuo database.

Esegui qualunque verifica tu voglia su queste due password. Ciò non impedirà all'utente di alternare tra due password (con un suffisso - è possibile impedire l'alternanza diretta per i suggerimenti in altre risposte), ma eviterà i casi più sfacciati.

    
risposta data 27.11.2012 - 16:47
fonte
7

da aggiungere alla risposta di @ martijnPieter la modifica minima può essere implementata eseguendo una forza bruta breve basata sulle password nuove e precedenti (che entrambi avete a disposizione)

ad esempio puoi scorrere tutte le password con una distanza di hamming di 1 o 2 dalla nuova password e vedere se corrisponde a un vecchio passaggio

ma potresti voler notare che questo può ridurre la fiducia degli utenti sulle password di hashing (in pratica stai dicendo che puoi recuperare una password precedente per rifiutare una nuova password)

    
risposta data 27.11.2012 - 16:40
fonte
5

Questo è davvero più un addendum alla risposta intelligente di @ Brian. Tanto di cappello anche a @Martijn Pieters per aggiungere dettagli su come forzare le vecchie password in base a quella corrente e su @ratchet freak per "hamming distance". Non sto cancellando la mia risposta perché penso che fornisca un background interessante per sostenerli.

Lo stato dell'arte della memorizzazione delle password richiede l'utilizzo di più round di un hash crittografico a una sola via (SHA-512 +) con un unico salt (128 bit +) per ogni utente. Ma non essere tentato di memorizzare ulteriori informazioni su ciascuna password. Più informazioni memorizzerai su ciascuna password, più minerai la sicurezza dell'algoritmo di hashing.

Esempio

Considera quanto è facile creare una password con la forza bruta se lo sai:

  • È lungo 7 caratteri
  • I caratteri 3-5 sono maiuscoli (4 è inferiore)
  • 1 e 7 sono numeri
  • 6 è un simbolo

Una tastiera USA ha 95 caratteri stampabili, quindi sapendo che la password è lunga 7 caratteri produce 95 ^ 7 = 69,833,729,610,000 = 7x10 ^ 13 permutazioni. Se fosse veramente casuale, potrebbe volerci un anno per craccarlo su un singolo processore 3Ghz. Ma:

  • Ci sono solo 26 caratteri maiuscoli e 26 caratteri minuscoli
  • Ci sono solo 10 cifre che offrono 100 possibilità per questi due numeri
  • Ci sono solo 32 simboli

Quindi (corretto grazie a @Hellion):

         26^4 (charcters 2-5 are known upper or lower-case)
        x 100 (characters 1 & 7 are digits)
        x  32 (character 6 is a symbol)
         ====
1,462,323,200 possible passwords.

È 50.000 volte più facile da decifrare! Memorizzare buone informazioni per evitare password simili in questo caso ha richiesto molto tempo per una password di 7 caratteri da un anno a un paio d'ore. Decodificare tutte le tue password con un potente desktop multiprocessore con una buona scheda video e un po 'di pazienza è ora molto fattibile. Spero che questo semplice esempio dimostri che più è significativo il confronto tra password simili, meno sicuro sarà il tuo hashing.

Importanza di Strong Hashing

I database con password vengono rubati regolarmente, con gigantesche irruzioni nelle notizie ogni mese. Diamine, solo il mese scorso lo stato di SC ha perso i numeri di sicurezza sociale di tutti - oops! Quante altre di queste violazioni sono coperte?

Pensiero di chiusura

La cosa più spaventosa per me è quando le persone scelgono la stessa password o password simili per più siti in modo che l'irruzione in uno dia l'accesso a tutti gli aggressori. Mi piacerebbe vedere un metodo collaudato per prevenire quella situazione, anche se penso che prevenire le password errate più comuni aiuterebbe di più che impedire a un singolo utente di riutilizzare la propria password errata all'interno dello stesso sito. Il meglio che posso suggerire è una politica aziendale per utilizzare un gestore di password sicuro che generi password altamente casuali per ciascuno dei tuoi utenti e li memorizzi in modo sicuro.

    
risposta data 28.11.2012 - 20:46
fonte
1

In primo luogo, è possibile memorizzare gli hash per le ultime "n" password precedenti, in modo da poter verificare se la loro nuova password duplica una password precedente. Hai anche il testo in chiaro della loro password corrente (perché hanno effettuato l'accesso o te l'hanno fornita per autenticare la richiesta di modifica della password) e la loro nuova password, in modo da poter verificare le minime modifiche tra queste due password.

Se (per te) è molto importante confrontare direttamente queste due password con le "n" password precedenti, allora devi memorizzare queste password (crittografate) per poterli recuperare in seguito.

Sebbene possa essere considerato un difetto di sicurezza, i metodi di crittografia potrebbero essere implementati per fornire una sicurezza sufficiente.

  1. Memorizza ogni password (crittografata), per le ultime "n" password.
  2. Memorizza la data e l'ora in cui è stata creata la password più recente.
  3. Salva l'hash della password più recente.
  4. Cripta tutte le password utilizzando l'hash (salato) della password corrente e il timestamp di creazione della password, e forse qualcosa come un numero di account o un indirizzo email.
  5. Rimuovi la crittografia e re-crittografa tutte le password ogni volta che viene creata una nuova password.

Quindi, ogni volta che la password viene modificata, è possibile annullare la crittografia di tutte le password precedenti e eseguire tutti i test di modifica minima.

Ora, se qualcuno avesse la password di questa persona e conoscesse tutti gli altri dettagli necessari, potrebbe codificare questa informazione per questa persona. Ma se hanno già la password di questa persona, possono già effettuare il login come questa persona e accedere all'account di questa persona.

Inoltre, per le vecchie password, potrebbe non dover essere memorizzato in testo rigorosamente in chiaro. Potrebbero essere archiviati in qualche modo offuscato. O memorizzato come un elenco alfabetico dei caratteri nella password.

Non sto dicendo che è una cosa raccomandabile da fare nel caso generale, ma assumendo che l'attività che hai descritto sia necessaria nel tuo caso, allora questo è un modo per ottenerlo con alcune misure di sicurezza.

    
risposta data 27.11.2012 - 22:06
fonte

Leggi altre domande sui tag