Salting Your Password: Best Practices?

Sono sempre stato curioso … Quale è meglio quando salate una password per l’hashing: prefisso o postfix? Perché? O è importante, purché salti?

Per spiegare: Tutti noi (si spera) sappiamo ormai che dovremmo salare una password prima di cancellarla per l’archiviazione nel database [ Modifica: Così puoi evitare cose come quello che è successo a Jeff Atwood di recente ]. In genere ciò avviene concatenando il sale con la password prima di passarlo attraverso l’algoritmo di hashing. Ma gli esempi variano … Alcuni esempi precedono il sale prima della password. Alcuni esempi aggiungono il sale dopo la password. Ne ho persino visto alcuni che cercano di mettere il sale nel mezzo.

Quindi qual è il metodo migliore e perché? Esiste un metodo che diminuisca le possibilità di una collisione hash? Il mio googling non ha trovato un’analisi decente sull’argomento.

Modifica: grandi risposte gente! Mi dispiace, ho potuto scegliere solo una risposta. 🙂

Prefisso o suffisso è irrilevante, si tratta solo di aggiungere entropia e lunghezza alla password.

Dovresti considerare queste tre cose:

  1. Il sale deve essere diverso per ogni password che memorizzi. (Questo è un malinteso abbastanza comune).
  2. Utilizzare un generatore di numeri casuali protetto da crittografia.
  3. Scegli un sale abbastanza lungo. Pensa al problema del compleanno.

C’è una risposta eccellente di Dave Sherohman a un’altra domanda sul perché dovresti usare i sali generati a caso invece del nome di un utente (o altri dati personali). Se segui questi suggerimenti, non importa dove metterai il tuo sale.

Penso che sia tutto semantico. Metterlo prima o dopo non importa se non contro un modello di minaccia molto specifico.

Il fatto che sia lì dovrebbe sconfiggere i tavoli arcobaleno.

Il modello di minaccia a cui ho fatto riferimento sarebbe lo scenario in cui l’avversario può avere tabelle arcobaleno di sali comuni aggiunti / anteposti alla password. (Dì l’NSA) Stai indovinando che l’hanno fatto aggiungere o anteporre, ma non entrambi. È sciocco, ed è una povera ipotesi.

Sarebbe meglio presumere di avere la capacità di immagazzinare queste tabelle arcobaleno, ma non, per esempio, tabelle con strani sali intervallati nel mezzo della password. In quel caso ristretto, vorrei congetturare che l’intercalare sarebbe meglio.

Come ho detto. È semantica. Scegli un sale diverso per password, un lungo sale e includi caratteri strani come simboli e codici ASCII: © ¤¡

La vera risposta, che nessuno sembra aver toccato, è che entrambi hanno torto . Se stai implementando la tua crittografia, non importa quanto sia banale una parte che pensi di fare, commetterai degli errori.

HMAC è un approccio migliore, ma anche se utilizzi qualcosa come SHA-1, hai già scelto un algoritmo che non è adatto per l’hashing delle password a causa della sua progettazione per la velocità. Usa qualcosa come bcrypt o eventualmente scrypt e prendi il problema completamente dalle tue mani.

Oh, e non pensare nemmeno a confrontare gli hash risultanti per l’uguaglianza con il tuo linguaggio di programmazione o le utilità di confronto delle stringhe di database. Quelli confrontano carattere per carattere e cortocircuito come false se un personaggio differisce. Quindi ora gli aggressori possono usare metodi statistici per cercare di capire cos’è l’hash, un personaggio alla volta.

Non dovrebbe fare alcuna differenza. L’hash non sarà più facilmente immaginabile ovunque tu metta il sale. Le collisioni di hash sono entrambe rare e imprevedibili, in quanto intenzionalmente non lineari. Se ha fatto la differenza per la sicurezza, ciò suggerirebbe un problema con l’hashing, non con la salatura.

Se si utilizza un hash crittograficamente sicuro, non dovrebbe importare se si pre o postfix; un punto di hashing è che un singolo cambiamento nei dati di origine (non importa dove) dovrebbe produrre un hash diverso.

Ciò che è importante, però, è l’uso di sali lunghi, generandoli con un PRNG crittografico appropriato e con sali per utente. La memorizzazione dei sali per utente nel database non è un problema di sicurezza, utilizzando un hash del sito.

Prima di tutto, il termine “tavolo arcobaleno” viene costantemente utilizzato in modo errato. Una tabella “arcobaleno” è solo un particolare tipo di tabella di ricerca, una che consente un particolare tipo di compressione dei dati sulle chiavi. Negoziando il calcolo per lo spazio, una tabella di ricerca che richiederebbe 1000 TB può essere compressa migliaia di volte in modo che possa essere archiviata su un’unità disco più piccola.

Dovresti essere preoccupato per l’hash di tabelle di ricerca password, arcobaleno o altro.

@ Onebyone.livejournal.com:

L’attaccante ha ‘tavole arcobaleno’ che consistono non degli hash delle parole del dizionario, ma dello stato dell’hash computation poco prima di finalizzare il calcolo dell’hash.

Potrebbe quindi essere meno costoso forzare una voce di file password con postfix sale rispetto al prefisso salt: per ogni parola del dizionario a sua volta si caricherà lo stato, aggiungere i byte salt nell’hash e quindi finalizzarlo. Con il sale prefissato non ci sarebbe nulla in comune tra i calcoli per ogni parola del dizionario.

Per una semplice funzione di hash che analizza linearmente attraverso la stringa di input, come un semplice generatore lineare congruenziale, questo è un attacco pratico. Ma una funzione di hash crittograficamente protetta viene deliberatamente progettata per avere più round, ognuno dei quali usa tutti i bit della stringa di input, in modo che il calcolo dello stato interno appena prima dell’aggiunta del sale non sia significativo dopo il primo round. Ad esempio, SHA-1 ha 80 round.

Inoltre gli algoritmi di hashing della password come PBKDF compongono la loro funzione hash più volte (si raccomanda di iterare PBKDF-2 un minimo di 1000 volte, ogni iterazione applicando due volte SHA-1) rendendo questo attacco doppiamente poco pratico.

BCrypt hash se la piattaforma ha un provider. Adoro come non ti preoccupi di creare i sali e puoi renderli ancora più forti se vuoi.

Inserendo il salt un numero arbitrario di caratteri nella password è il caso meno prevedibile, e quindi il più “sicuro” socialmente, ma in realtà non è molto significativo nel caso generale fintanto che usi una password unica e univoca corde per sali.