Quale algoritmo dovrei usare per hash password nel mio database?

C’è qualcosa che non è banalmente irrisolvibile?

Questa risposta del 2008 è ormai pericolosamente obsoleta. SHA (tutte le varianti) è ora banalmente irrinunciabile, e le migliori pratiche sono ora (a partire da gennaio 2013) l’uso di un hash di key-stretching (come PBKDF2) o idealmente uno di RAM (come Bcrypt ) e aggiungere un sale per utente pure.

I punti 2, 3 e 4 valgono ancora la pena prestare attenzione.

Visita il sito IT Security SE per ulteriori informazioni.


Risposta originale del 2008:

  1. Utilizzare un algoritmo comprovato. SHA-256 utilizza 64 caratteri nel database, ma con un indice sulla colonna che non è un problema ed è un hash provato e più affidabile di MD5 e SHA-1. È anche implementato nella maggior parte delle lingue come parte della suite di sicurezza standard. Tuttavia non ti senti male se usi SHA-1.

  2. Non solo cancellare la password, ma inserire anche altre informazioni. Spesso usi l’hash di “username: password: salt” o simile, piuttosto che la sola password, ma se giochi con questo, rendi ancora più difficile l’esecuzione di un attacco di dizionario.

  3. La sicurezza è un campo difficile, non pensare di poter inventare i propri algoritmi e protocolli.

  4. Non scrivere log come “[AddUser] Hash di GeorgeBush: Rep4Lyfe: ASOIJNTY è xyz”

La prima regola per la crittografia e l’archiviazione delle password è ” non inventare te stesso “, ma se devi essere il minimo necessario per avere una parvenza di sicurezza:

Regole cardinali:

  1. Non memorizzare mai una password in testo semplice (il che significa che non puoi mai visualizzarla o trasmetterla).
  2. Non trasmettere mai la rappresentazione memorizzata di una password su una linea non protetta (testo normale, codificata o hash).
  3. La velocità è il tuo nemico.
  4. Rianalizza regolarmente e migliora il tuo processo man mano che l’hardware e la crittanalisi migliorano.
  5. La crittografia e il processo sono una parte molto piccola della soluzione.
  6. I punti di errore includono: archiviazione, cliente, trasmissione, elaborazione, utente, garanzie legali, intrusione e amministratori.

passi:

  1. Applicare alcuni requisiti minimi ragionevoli per la password.
  2. Cambia password frequentemente.
  3. Usa l’hash più forte che puoi ottenere – SHA-256 è stato suggerito qui.
  4. Combina la password con un sale fisso (uguale per l’intero database).
  5. Combina il risultato del passaggio precedente con un sale unico (forse il nome utente, l’ID del record, un guid, un numero casuale lungo, ecc.) Che è memorizzato e allegato a questo record.
  6. Esegui l’algoritmo hash più volte, come 1000+ volte . Idealmente includere un diverso sale ogni volta con l’hash precedente. La velocità è il tuo nemico e più iterazioni riducono la velocità. Ogni tanto raddoppia le iterazioni (questo richiede l’acquisizione di un nuovo hash – fallo alla prossima modifica della password).

Oh, ea meno che tu non stia utilizzando SSL o qualche altra sicurezza di linea, allora non permettere che la tua password sia trasmessa in chiaro. E se stai solo confrontando l’hash finale dal client al tuo hash memorizzato, allora non permettere che sia trasmesso in chiaro. Devi inviare un nonce (numero usato una volta) al client e fare in modo che abbia hash con il loro hash generato (usando i passaggi precedenti) hash e poi ti mandano quello. Sul lato server si esegue lo stesso processo e si vede se i due hash di una volta corrispondono. Quindi smaltirli. C’è un modo migliore, ma quello è il più semplice.

CodingHorror ha avuto un grande articolo su questo ultimo anno

http://www.codinghorror.com/blog/archives/000953.html

La raccomandazione alla fine dell’articolo è BCrypt

Gli algoritmi sopra menzionati sono algoritmi di hashing crittograficamente sicuri (ma MD5 non è considerato sicuro oggi).

Tuttavia ci sono algoritmi, creati appositamente per ricavare le chiavi dalle password. Queste sono le funzioni di derivazione chiave . Sono progettati per l’uso con crittografi simmetrici, ma sono anche utili per la memorizzazione della password. Ad esempio, PBKDF2 utilizza sale, un numero elevato di iterazioni e una buona funzione di hash. Se hai una libreria, cosa la implementa (ad esempio .NET), penso che dovresti prenderla in considerazione.

Aggiungi un salt unico al valore della password hash (memorizza il valore salt nel db). Quando si utilizza un sale unico, il vantaggio di utilizzare un algoritmo più sicuro di SHA1 o MD5 non è realmente necessario (a quel punto si tratta di un miglioramento incrementale, mentre l’uso di un sale è un miglioramento monumentale).

Usa una forte funzione di hash crytographic come MD5 o SHA1, ma assicurati di usare un buon sale , altrimenti sarai sobject agli attacchi del tavolo arcobaleno .

Aggiornamento gennaio 2013

La risposta originale è del 2008 e le cose si sono un po ‘spostate negli ultimi 5 anni. La pronta disponibilità del cloud computing e le potenti tabs grafiche con processore parallelo consentono l’utilizzo di password fino a 8 o 9 caratteri come MD5 o SHA1 sono ora banalmente irrisolvibili.

Ora un lungo sale è un must, come è qualcosa di più duro come SHA512.

Tuttavia, tutti gli hash della variante SHA sono progettati per la crittografia delle comunicazioni: messaggi avanti e indietro dove ogni messaggio è crittografato e per questo motivo sono progettati per essere veloci .

Nel mondo dell’hashing delle password questo design è un grosso svantaggio poiché più veloce è l’hash, più tempo ci vuole per generare un numero elevato di hash.

Un hash veloce come SHA512 può essere generato milioni, anche miliardi di volte al secondo. Getta in un’elaborazione parallela a basso costo e ogni ansible permutazione di una password diventa un must assoluto.

Allungare le chiavi è un modo per combatterlo. Un algoritmo di allungamento della chiave (come PBKDF2) applica un hash più veloce (come SHA512) migliaia di volte, causando in genere che la generazione hash impieghi 1/5 di secondo circa. Qualcuno che accede non si accorgerà, ma se si riesce a generare solo 5 hash al secondo, gli attacchi di forza bruta sono molto più difficili.

In secondo luogo, dovrebbe esserci sempre un sale casuale per utente. Questo può essere generato casualmente come i primi n byte dell’hash (che vengono quindi eliminati e aggiunti al testo della password da verificare prima di build gli hash da confrontare) o come una colonna DB aggiuntiva.

Così:

Quale algoritmo dovrei usare per hash password nel mio database?

  • Allungamento delle chiavi per rallentare la generazione di hash. Probabilmente andrei con PBKDF2.

  • Per utente sale significa un nuovo attacco per utente, e alcuni lavorano a capire come ottenere il sale.

Il potere di calcolo e la disponibilità stanno aumentando in modo esponenziale – è probabile che queste regole cambieranno di nuovo in altri 4 anni. Se hai bisogno di sicurezza a prova di futuro, indago sugli hash di stile bcrypt / scrypt: questi prendono gli algoritmi di allungamento della chiave più lenti e aggiungono un passo che utilizza molta RAM per generare l’hash. L’utilizzo di così tanta RAM riduce l’efficacia dei processori paralleli economici.

Originale settembre 2008 (lasciato così commentato)

MD5 + sale o SHA1 + sale non è “banalmente friabile” – la maggior parte degli hack dipende da enormi tabelle arcobaleno e queste diventano meno utili con un [update, now they are] sale [update, now they are] .

MD5 + salt è un’opzione relativamente debole, ma non sarà facilmente interrotta [update, now it is very easy to break] .

SHA2 arriva fino a 512 – sarà praticamente imansible decifrare con un kit prontamente disponibile [update, pretty easy up to 9 char passwords now] – anche se sono certo che c’è un Cray in qualche bunker militare da qualche parte che può fare [You can now rent this 'Cray' from Amazon]

MD5 o SHA in combinazione con un valore salino generato casualmente per ogni voce

come accennato in precedenza, non si dovrebbero usare algoritmi di hashing semplici, ecco il motivo per cui:

http://arstechnica.com/security/2012/08/passwords-under-assault/

quindi usa qualcos’altro come http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

Tutti gli algoritmi di hashing sono vulnerabili a un “attacco dizionario”. Questo è semplicemente il punto in cui l’utente malintenzionato ha un dizionario molto ampio di possibili password e le ha cancellate tutte. Poi vedono se qualcuno di questi hash corrisponde all’hash della password che vogliono decifrare. Questa tecnica può facilmente testare milioni di password. Questo è il motivo per cui è necessario evitare qualsiasi password che potrebbe essere prevedibile da remoto.

Ma, se si è disposti ad accettare la minaccia di un attacco di dizionario, MD5 e SHA1 sarebbero entrambi più che adeguati. SHA1 è più sicuro, ma per la maggior parte delle applicazioni questo non è un miglioramento significativo.

Gli hash MD5 / SHA1 sono entrambe buone scelte. MD5 è leggermente più debole di SHA1.