2009-07-27 11 views
38

Supponiamo che tu fossi libero di decidere come memorizzare le password hash in un DBMS. Ci sono evidenti debolezze in uno schema come questo?hashing della password, sale e memorizzazione dei valori hash

Per creare il valore hash memorizzato in DBMS, prendono:

  • Un valore che è unico per l'istanza del DBMS server come parte del sale,
  • e il nome utente come seconda parte della sale,
  • E creare la concatenazione del sale con la password attuale,
  • E hash l'intera stringa utilizzando l'algoritmo SHA-256,
  • e memorizzare il risultato nel DBMS.

Ciò significa che chiunque desideri ottenere una collisione dovrebbe dover eseguire il lavoro separatamente per ciascun nome utente e ogni istanza del server DBMS separatamente. Avrei intenzione di mantenere un po 'flessibile l'attuale meccanismo di hash per consentire l'utilizzo del nuovo algoritmo di hash standard NIST (SHA-3) su cui si sta ancora lavorando.

Il "valore che è univoco per l'istanza del server DBMS" non deve essere segreto, sebbene non venga divulgato in modo casuale. L'intenzione è di garantire che se qualcuno usa la stessa password in diverse istanze del server DBMS, gli hash registrati sarebbero diversi. Allo stesso modo, il nome utente non sarebbe segreto: solo la password corretta.

Potrebbe esserci qualche vantaggio prima di avere la password e il nome utente e il "valore unico" secondo, o qualsiasi altra permutazione delle tre fonti di dati? O che dire dell'incrocio tra le corde?

Devo aggiungere (e registrare) un valore salt random (per password) e le informazioni sopra? (Vantaggio: l'utente può riutilizzare una password e ancora, probabilmente, ottenere un hash diverso registrato nel database Svantaggio: il sale deve essere registrato.Subito che il vantaggio superi notevolmente lo svantaggio.)

Ci sono un bel po 'di domande relative SO - questa lista è improbabile che sia completo:

penso che le risposte a queste domande supportano il mio algoritmo (anche se è sufficiente utilizzare un sale casuale, quindi il 'valore unico per server' e componenti nome utente sono meno importanti).

+1

La parte casuale è importante per prevenire gli attacchi di predizione – Jacco

+0

è possibile aggiungere http: // stackoverflow.it/questions/1645161/salt-generation-and-open-source-software/1645190 # 1645190 al tuo elenco articoli – Jacco

+0

Aggiungi anche http://dba.stackexchange.com/questions/7492/password-hashes-fixed-length- campo binario-o-single-string-field come buona guida al sito [dba.se] – jcolebrand

risposta

31

Il sale deve essere solo casuale e unico. Può essere conosciuto liberamente in quanto non aiuta un aggressore. Molti sistemi memorizzeranno il testo semplice salt nel database nella colonna accanto alla password hash.

Il sale aiuta a garantire che se due persone (Utente A e Utente B) condividono la stessa password non è ovvio. Senza il sale casuale e univoco per ogni password, i valori hash sarebbero gli stessi e ovviamente se la password per l'utente A è incrinata, allora l'utente B deve avere la stessa password.

Aiuta anche a proteggere dagli attacchi in cui un dizionario di hash può essere confrontato con password conosciute. per esempio. tavoli arcobaleno.

Anche l'utilizzo di un algoritmo con un "fattore di lavoro" incorporato significa anche che con l'aumentare della potenza di calcolo è possibile aumentare anche il lavoro che un algoritmo deve eseguire per creare l'hash. Ad esempio, bcrypt. Ciò significa che l'economia degli attacchi di forza bruta diventa insostenibile. Presumibilmente diventa molto più difficile creare tabelle con noti hash perché impiegano più tempo per creare; le variazioni nel "fattore di lavoro" significheranno più tabelle da costruire.

+5

Salting inoltre ci protegge da un attacco basato su tavolo arcobaleno –

+0

Sì; come ho notato nei commenti ad altre risposte, la mia domanda si è trasformata man mano che l'ho scritta, e ho realizzato che il sale casuale era necessario, ma non ho avuto il tempo di riflettere sul fatto che fosse anche sufficiente. L'aggiunta del nome utente al mix allunga principalmente i dati su cui l'algoritmo hash deve lavorare, aiutando a proteggere le password brevi. Quanto è reale questa protezione extra, non ne sono sicuro. –

+10

Questa risposta è sbagliata. Lo scopo dei sali è * non * quindi "le password condivise non sono ovvie". Lo scopo è rendere gli attacchi del dizionario molto più difficili. (Consentire che risposte pericolosamente errate come questa siano contrassegnate come una "risposta" è un difetto di progettazione fatale di questo sito.) –

6

Perché non aggiungere un salt casuale alla password e cancellare quella combinazione. Quindi concatenare l'hash e il sale a un singolo byte [] e memorizzarlo nel db?

Il vantaggio di un salt casuale è che l'utente è libero di cambiare il suo nome utente.Il Salt non deve essere segreto, dal momento che è usato per prevenire attacchi di dizionario.

+2

+1 per aver menzionato che un utente non è più libero di cambiare il proprio nome utente! –

+0

@pb: in questo contesto, non voglio che gli utenti cambino nome, grazie. In alcuni contesti potrebbe essere utile, ma per quanto riguarda l'app, il nome di un utente è fisso (o, più precisamente, se qualcuno cambia il suo nome diventa un nuovo utente diverso). Usare solo salt random e password è probabilmente OK; Sono un po 'preoccupato di garantire che ci sia abbastanza materiale per l'algoritmo di hash in cui inserire i denti - questa è un'altra parte del motivo per aggiungere altro oltre al sale. Mentre scrivevo la domanda, mi resi conto che era necessario il sale casuale; Non ho notato che era sufficiente. –

+0

l'utente sarebbe comunque in grado di modificare il proprio nome utente, ma in quel momento sarà necessario ripetere la password. D'altra parte, l'uso di un sale casuale ha gli stessi o maggiori benefici dell'uso di un sale non casuale. – wprl

19

Penso che tu stia complicando troppo il problema.

Inizia con il problema:

  1. Stai cercando di proteggere le password deboli?
  2. Stai cercando di mitigare gli attacchi arcobaleno?

Il meccanismo proposto protegge da un semplice attacco arcobaleno, poiché anche se l'utente A e l'utente B hanno la password SAME, la password con hash sarà diversa. Lo fa, sembra un metodo piuttosto elaborato per salare una password che è eccessivamente complicata.

  • Cosa succede quando si esegue la migrazione del DB su un altro server?
    • È possibile modificare l'univoco, in base al valore DB, se è possibile generare una tabella arcobaleno globale, in caso contrario non è possibile ripristinare il DB.

Invece vorrei solo aggiungere la colonna supplementare e memorizzare un sale casuale corretta. Questo proteggerebbe da ogni tipo di attacco arcobaleno. Attraverso più distribuzioni.

Tuttavia, non ti proteggerà da un attacco di forza bruta. Quindi, se stai cercando di proteggere gli utenti che hanno password scadenti, dovrai cercare altrove. Ad esempio, se i tuoi utenti hanno password di 4 lettere, potrebbe probabilmente essere decifrato in pochi secondi anche con un salt e l'algoritmo hash più recente.

+0

Bella risposta.Hai un voto e gratifica il 10K! –

+0

: p grazie! –

+1

Penso che potresti avere ragione - mentre scrivevo la domanda, mi resi conto che era necessario il sale casuale; Non ho preso il tempo di notare che era anche sufficiente. Detto questo, una preoccupazione è dare all'algoritmo hash più dati su cui lavorare - e il nome utente aiuta un po ', così come il sale. Il ripristino su un'altra istanza del server DBMS è una preoccupazione valida, a cui non avrei pensato. Nome utente e sale andrebbero bene sotto questo, e il nome utente non è necessario al 100%. Grazie. –

7

Penso che sia necessario chiedersi "Cosa speri di ottenere rendendo questo più complicato del semplice generare un valore salt casuale e memorizzarlo?" Più il tuo algoritmo è complicato, più è probabile che tu introduca una debolezza inavvertitamente. Probabilmente questo sembrerà snarky, non importa come lo dico, ma è inteso come aiuto - cosa c'è di così speciale nella tua app che ha bisogno di un nuovo algoritmo di hashing della password?

+0

@Peter: nessuna offesa presa - Capisco cosa stai dicendo. Un aspetto di "ciò che è diverso" come stavo scrivendo era "assicurati che server diversi con la stessa password memorizzino chiavi diverse". Come notato in altri commenti, mi sono reso conto vicino alla fine della domanda che il sale casuale era necessario; Non ho notato che fosse sufficiente. E i dati aggiuntivi nell'hash aiutano a proteggere le password brevi e povere. Quello che non riesco a valutare è la differenza che fa. –

+0

Continua: Se il sale è un numero intero di 8 byte e la password è una singola lettera, un hash SHA-256 lo protegge davvero? Se il nome utente è di 3 caratteri e il dato 'server unique' è, per esempio, una stringa a 32 caratteri determinata casualmente (ma fissa), ciò aiuta a proteggere i dati - 44 byte di dati su cui lavorare invece di solo 9. Sembra come dovrebbe essere più sicuro (9 byte potrebbero essere attaccati dall'arcobaleno, probabilmente 44 byte non potrebbero essere attaccati facilmente). Forse il 'server unique' deve solo essere una 'stringa fissa a 32 byte'; ... –

+0

Continuare (2): ... o forse è necessario eseguire il pad 'sale plus password' su 64 byte (o 32 byte, o qualche altro numero) con una stringa fissa? O forse questa è tutta una caccia alle oche; non importa davvero. –