Come implementare una cronologia password sicura


23

Le password non devono essere archiviate in testo semplice per ovvi motivi di sicurezza: è necessario archiviare gli hash e anche generare l'hash con attenzione per evitare attacchi da tavolo arcobaleno.

Tuttavia, in genere è necessario archiviare le ultime n password e imporre 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 ). Questo sarebbe banale con le password in testo semplice, ma come puoi farlo memorizzando solo hash?

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


2
Correlati: security.stackexchange.com/questions/4704/… (e BTW quel sito potrebbe essere una posizione migliore per questa domanda). Per quanto riguarda il "cambiamento minimo", non riesco a pensare ad alcuna alternativa alla generazione di tutte le opzioni che si qualificherebbero come "cambiamento minimo" (che potrebbe essere MOLTO a seconda della tua definizione!) E confrontando gli hash. Qual è la definizione di "cambiamento minimo"?
Kevin Vermeer,

7
Memorizzare le ultime n password significa solo che l'utente sceglierà una sequenza che va da 1 a n + 1 .
Joachim Sauer,

11
Sono molto scettico sul fatto che una tale politica di password migliora la sicurezza; IMHO, aumenta le possibilità che le persone ricorrono a mantenere la password su una nota adesiva. Il link di Kevin è una buona discussione. @KevinVermeer: ​​in realtà puoi misurare l'entità del cambiamento come distanza di Levenshtein ( en.wikipedia.org/wiki/Levenshtein_distance ), nota anche come "modifica distanza".
Nathan Long,

5
Se la tua sicurezza è così rigida, potresti anche generare una password casuale per l'utente, costringerli a usarla e cambiarla a intervalli regolari. In questo modo hai il controllo totale sulla loro password.
Reactgular,

2
@nathan: l'archiviazione delle password su una nota adesiva è in realtà sicura. Non è possibile attaccare la password se non si ha accesso fisico alla nota adesiva, eliminando circa il 99% delle minacce. Metti quella nota in un portafoglio o in una borsa, e in pratica devi fondare la persona per ottenerla, il che significa che una violazione della sicurezza viene identificata e può essere mitigata.
mattnz,

Risposte:


22

Memorizza gli hash e verifica una password immessa rispetto a quegli hash memorizzati, allo stesso modo in cui verifichi una password durante l'accesso. Dovresti generare password "alternative" da quella fornita in base a schemi numerici per rilevare le modifiche "minime".

All'accesso, si verifica già la password immessa rispetto a un hash, non è necessario archiviare la password in testo normale. Lo stesso trucco funziona quando si tratta di cambiare una password, è sufficiente controllare le password inserite e il "minimo cambiamento" generato contro gli hash storici. Se la nuova password è soddisfacente, spostare l'hash della password corrente sul set storico e sostituirlo con un nuovo hash per la nuova password.


Quindi, se l'utente immette Password6, dovrei rilevare la parte numerica e provare ad esempio Password4 , Password5 , Password7 e così via. È corretto?
Wizard79,

4
@Lorenzo: corretto. Generare alternative può essere complesso come lo desideri, assicurati solo di trovare il giusto compromesso tra complessità e rischio (non lasciare che i tuoi utenti aspettino 5 minuti mentre controlli tutte le possibilità con l'evanescente probabilità di essere un rischio).
Martijn Pieters,

Non sono sicuro che suggerire di aumentare il numero alla fine sia un buon suggerimento da dare agli utenti - è solo un po 'prevedibile. E diventa esponenzialmente di più se stai dicendo agli utenti di farlo.
Wyatt Barnett,

2
@WyattBarnett: nessuno sta dicendo agli utenti di farlo. Il punto è rilevare gli utenti che lo fanno e impedire l'utilizzo della password "incrementata".
Martijn Pieters,

Ah, ho letto male qualcosa qui. Scusate.
Wyatt Barnett,

28

Quando l'utente cambia la propria password, è necessario inserire la password precedente. Ora hai accesso a due password di testo semplice, anche se non stai memorizzando le password di testo normale nel tuo database.

Esegui tutte le verifiche che desideri su queste due password. Ciò non impedisce all'utente di alternare tra due password (con un suffisso - è possibile impedire l'alternanza diretta per i suggerimenti in altre risposte), ma impedirà i casi più palesi.


Bene, questa è sicuramente una soluzione intelligente se non hai l'obbligo di testare con n password precedenti, tuttavia il suggerimento di generare le alternative appena in tempo è migliore. Ma generare alternative di entrambe le password è ancora meglio!
Wizard79,

2
@Lorenzo: L'idea è che tu faccia un test diretto contro le n password precedenti e un test più forte contro l'ultima password. È un compromesso.
Brian,

Sì. Se la loro password attuale è potatoSalad1e vogliono aggiornarsi potatoSalad2, dici che la modifica è troppo piccola perché in quel momento hai entrambe le password in chiaro. Ma più indietro di questo, hai solo hash e la natura degli hash è che non puoi dire se due hash hanno come testo testo simile o completamente diverso.
Nathan Long,

7

per aggiungere alla risposta di @ martijnPieter il minimo cambiamento può essere implementato facendo una breve forza bruta basata sulle password nuove e precedenti (che entrambi avete a disposizione)

ad esempio è possibile scorrere tutte le password con una distanza di 1 o 2 rispetto alla nuova password e vedere se corrisponde a una pass precedente

ma potresti voler notare che ciò può ridurre la fiducia degli utenti che stai inserendo password (come in sostanza stai dicendo che puoi recuperare una password precedente per rifiutare una nuova password)


Ma ci sono molte sequenze con distanze di Hamming più grandi come Febbraio2012 -> Marzo 2012 o Ven-09-28-12 -> Mar-11-27-12 (date), Password_Alpha -> Password_Beta, Pass_1111 -> Pass_2222, Pass_qwer, Pass_tyui, Passa, _op [] o Eleven -> Dodici (sistemi di conteggio alternativi) o FrankSmith -> FredJones -> FriarTuck o rabbia -> animale -> apple (nomi in una directory aziendale o parole in un dizionario) che un attaccante con il password precedenti potrebbero facilmente indovinare, ma il tuo algoritmo avrebbe difficoltà a generare.
Kevin Vermeer,

@KevinVermeer quindi tiene conto di quelli nel tuo generatore di variazioni e accetta che non otterrai mai tutto
maniaco del cricchetto

+1 per ridurre la fiducia. Quando vedo qualcosa che mi dice che la mia password è troppo simile a quella che ho usato tre mesi fa, mi chiedo immediatamente se li stanno memorizzando in modo reversibile ... o se hanno un programmatore fantastico. Lo scetticismo di solito vince.
Tim Post

5

Questo è davvero più di un addendum alla risposta intelligente di @ Brian. Tanto di cappello anche a @Martijn Pieters per l'aggiunta di dettagli su come forzare la forzatura delle vecchie password in base a quella corrente e al maniaco di @ratchet per "distanza di lancio". Non sto eliminando la mia risposta perché penso che fornisca uno sfondo interessante per il backup.

La memorizzazione di password all'avanguardia richiede l'utilizzo di più round di un forte hash crittografico unidirezionale (SHA-512 +) con sale univoco (128 bit +) per ciascun utente. Ma non essere tentato di memorizzare ulteriori informazioni su ciascuna password. Più informazioni memorizzerai su ciascuna password, più minerai la sicurezza del tuo algoritmo di hashing.

Esempio

Considera quanto diventa facile forzare una password se sai che:

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

Una tastiera americana ha 95 caratteri stampabili, quindi sapere che la password è lunga 7 caratteri produce 95 ^ 7 = 69.833.729.610.000 = 7x10 ^ 13 permutazioni. Se fosse davvero casuale, potrebbe volerci un anno per decifrarlo su un singolo processore 3Ghz. Ma:

  • Ci sono solo 26 caratteri maiuscoli e 26 caratteri minuscoli
  • Ci sono solo 10 cifre che danno 100 possibilità per quei 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! La memorizzazione di informazioni valide per prevenire password simili in questo caso ha richiesto del tempo di crack per una password di 7 caratteri da un anno a un paio d'ore. Decodificare tutte le tue password con un potente desktop multi-processore con una buona scheda video e un po 'di pazienza è ora molto fattibile. Spero che questo semplice esempio dimostri che più significativamente puoi confrontare password simili, meno sicuro sarà il tuo hashing.

Importanza dell'hashing forte

I database con password vengono rubati regolarmente, con immense violazioni nelle notizie ogni mese. Diamine, proprio il mese scorso lo stato di SC ha perso i numeri di previdenza 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 una password simile per più siti in modo che la violazione in uno dia accesso all'attaccante a tutti. Mi piacerebbe vedere un metodo collaudato per prevenire quella situazione, anche se penso che prevenire le password sbagliate più comuni sarebbe di aiuto 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 a livello aziendale per utilizzare un gestore di password sicuro che genera password altamente casuali per ciascuno dei tuoi utenti e le memorizza in modo sicuro.


1
nit minore: le possibilità di password sono ancora moltiplicative, quindi è (26 ^ 4) * 100 * 32 = 1.462.323.200. Se assumiamo che le possibilità di cracking (95 ^ 7) richiedano un anno, allora il cracking di questo numero inferiore di possibilità richiederà circa 11 minuti.
Hellion,

@Hellion - Oops! Grazie per la segnalazione. L'ho corretto.
GlenPeterson,

1

Innanzitutto, è 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 semplice testo della loro password corrente (perché hanno effettuato l'accesso o te lo hanno fornito per autenticare la loro richiesta di modifica della password) e la loro nuova password, in modo da poter verificare la presenza di minime modifiche tra queste due password.

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

Mentre potrebbe essere visto come un difetto di sicurezza per fare questo, 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. Memorizza l'hash della password più recente.
  4. Crittografa tutte le password utilizzando l'hash (salato) della password corrente, il timestamp di creazione della password e forse qualcosa come un numero di account o un indirizzo e-mail.
  5. Annulla la crittografia e crittografa nuovamente 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 vecchie password ed eseguire tutti i test di modifica minima.

Ora, se qualcuno avesse la password di questa persona e conoscesse tutti gli altri dettagli necessari, potrebbe decodificare queste informazioni per questa persona. Ma se hanno già la password di questa persona, possono già accedere come questa persona e accedere all'account di questa persona.

Inoltre, per le vecchie password, potrebbe non essere necessario memorizzarle in testo rigorosamente semplice. Potrebbero essere conservati in qualche modo offuscato. O memorizzato come un elenco alfabetico dei caratteri nella password.

Non sto dicendo che questa è una cosa raccomandata da fare nel caso generale, ma supponendo che il compito che hai descritto sia richiesto nel tuo caso, questo è un modo per farlo con alcune misure di sicurezza.


Questa risposta fornisce alcuni terribili suggerimenti in termini di sicurezza. Non dovremmo essere in grado di decrittografare facilmente le password, né memorizzarle in "un modo offuscato" invece di crittografarle fortemente.
user45623
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.