Domanda

    

Questa domanda ha già una risposta qui:

    
            
  •              Hashing sicuro delle password                                      9 risposte                          
  •     
    

C'è qualcosa disponibile che non è banalmente fragile?

È stato utile?

Soluzione

  

Questa risposta del 2008 è ora pericolosamente obsoleta. SHA (tutte le varianti) è ora banalmente fragile, e le migliori pratiche ora (a gennaio 2013) usano un hash di key-stretching (come PBKDF2) o idealmente uno ad alta intensità di RAM (come Bcrypt ) e per aggiungere anche un sale per utente.

     

Vale ancora la pena prestare attenzione ai punti 2, 3 e 4.

     

Visita il sito IT Security SE per maggiori informazioni.


Risposta originale del 2008:

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

  2. Non solo hash la password, ma inserisci anche altre informazioni. Spesso usi l'hash di " nome utente: password: salt " o simile, piuttosto che solo la password, ma se giochi con questo allora rendi ancora più difficile eseguire un attacco del dizionario.

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

  4. Non scrivere registri come " [AddUser] Hash of GeorgeBush: Rep4Lyfe: ASOIJNTY è xyz "

Altri suggerimenti

La prima regola della crittografia e dell'archiviazione delle password è " non inventarlo tu , " ma se devi qui è il minimo assoluto che devi fare per avere una parvenza di sicurezza:

Regole cardinali:

  1. Non archiviare mai una password in testo semplice (il che significa che non puoi nemmeno visualizzarla o trasmetterla.)
  2. Non trasmettere mai la rappresentazione memorizzata di una password su una linea non protetta (testo normale, codificato o con hash).
  3. La velocità è il tuo nemico.
  4. Rianalizza regolarmente e migliora il tuo processo con il miglioramento dell'hardware e della crittoanalisi.
  5. La crittografia e il processo sono una parte molto piccola della soluzione.
  6. I punti di errore includono: archiviazione, client, trasmissione, elaborazione, utente, warrant legali, intrusione e amministratori.

Passi:

  1. Applicare alcuni requisiti di password minimi ragionevoli.
  2. Cambia password frequentemente.
  3. Usa l'hash più forte che puoi ottenere - SHA-256 è stato suggerito qui.
  4. Combina la password con un salt fisso (lo stesso per l'intero database).
  5. Combina il risultato del passaggio precedente con un salt univoco (forse il nome utente, l'ID record, un guid, un numero casuale lungo, ecc.) che viene archiviato e allegato a questo record.
  6. Esegui l'algoritmo hash più volte - come 1000+ volte . Idealmente includi un sale diverso ogni volta con l'hash precedente. La velocità è il tuo nemico e molteplici iterazioni riducono la velocità. Ogni tanto raddoppiano le iterazioni (ciò richiede l'acquisizione di un nuovo hash - fallo la prossima volta che cambiano la loro password.)

Oh, e a meno che tu non stia eseguendo SSL o qualche altra sicurezza di linea, non permettere che la tua password sia trasmessa in testo semplice. E se stai solo confrontando l'hash finale dal client con l'hash memorizzato, non permettere nemmeno che venga trasmesso in testo normale. Devi inviare un nonce (numero usato una volta) al client e fargli avere l'hash con il loro hash generato (usando i passaggi sopra) e poi ti inviano quello. Sul lato server esegui lo stesso processo e vedi se i due hash di una volta corrispondono. Quindi eliminali. C'è un modo migliore, ma quello è il più semplice.

CodingHorror ha pubblicato un ottimo articolo sull'ultimo anno

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

La raccomandazione alla fine dell'articolo è BCrypt

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

Tuttavia ci sono algoritmi creati appositamente per derivare le chiavi dalle password. Queste sono le funzioni di derivazione chiave . Sono progettati per l'uso con cifre simmetriche, ma sono utili anche per la memorizzazione di password. PBKDF2 ad esempio utilizza il sale, un gran numero di iterazioni e una buona funzione hash. Se hai una libreria, ciò che la implementa (ad esempio .NET), penso che dovresti prenderla in considerazione.

Aggiungi un salt unico al valore della password con hash (memorizza il valore salt nel db). Quando un viene utilizzato un unico sale 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 hash crittografica come MD5 o SHA1, ma assicurati di usare un buon salt , altrimenti sarai suscettibile agli attacchi arcobaleno .

Aggiornamento gennaio 2013

La risposta originale è del 2008 e le cose si sono spostate un po 'negli ultimi 5 anni. La pronta disponibilità del cloud computing e delle potenti schede grafiche a processore parallelo significa che le password con un massimo di 8 o 9 caratteri con hash come MD5 o SHA1 sono ora banalmente fragili.

Ora un lungo sale è d'obbligo, così 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 in cui ogni messaggio è crittografato e per questo motivo sono progettati per essere veloci .

Nel mondo dell'hash delle password questo design è un grosso svantaggio in quanto più veloce è l'hash, meno tempo ci vuole per generare un gran numero di hash.

Un hash veloce come SHA512 può essere generato milioni, anche miliardi di volte al secondo. Gettare in parallelo elaborazione a buon mercato e ogni possibile permutazione di una password diventa un must assoluto.

L'estensione dei tasti è un modo per combattere questo. Un algoritmo di stiramento dei tasti (come PBKDF2) applica un hash più veloce (come SHA512) migliaia di volte, in genere facendo sì che la generazione di hash impieghi circa 1/5 di secondo. Qualcuno che accede non se ne accorgerà, ma se riesci a generare solo 5 hash al secondo gli attacchi di forza bruta sono molto più difficili.

In secondo luogo dovrebbe essere sempre un sale casuale per utente. Questo può essere generato casualmente come primi n byte dell'hash (che vengono poi rimossi e aggiunti al testo della password da controllare prima di creare gli hash da confrontare) o come colonna DB aggiuntiva.

  

Quale algoritmo dovrei usare per eseguire l'hash delle password nel mio database?

  • Key-stretching per rallentare la generazione dell'hash. Probabilmente andrei con PBKDF2.

  • Salt per utente indica un nuovo attacco per utente e alcuni lavori per capire come ottenere il sale.

La potenza 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, analizzerei gli hash di stile bcrypt / scrypt: questi prendono gli algoritmi di stiramento dei tasti più lenti e aggiungono un passaggio che utilizza molta RAM per generare l'hash. L'uso di così tanta RAM riduce l'efficacia dei processori paralleli economici.

Originale settembre 2008 (lasciato in modo che i commenti abbiano un senso)

MD5 + salt o SHA1 + salt non sono "banalmente fragili" - la maggior parte degli hack dipende da enormi tabelle arcobaleno e questi diventano meno utili con un salt [aggiornamento, ora sono] .

MD5 + salt è un'opzione relativamente debole, ma non si romperà facilmente [aggiorna, ora è molto facile da spezzare] .

SHA2 arriva fino a 512 - sarà quasi impossibile decifrare con il kit facilmente disponibile [aggiorna, abbastanza facile fino a 9 password char ora] - anche se sono sicuro che ci sia un Cray in un bunker militare da qualche parte che può farlo [Ora puoi noleggiare questo 'Cray' da Amazon]

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

come accennato in precedenza, gli algoritmi di hashing semplice non devono essere utilizzati qui è il motivo per cui:

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

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 da dizionario". Questo è semplicemente il punto in cui l'attaccante ha un dizionario molto ampio di possibili password e le ha tutte con hash. Quindi vedono se uno 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 può essere prevedibile in remoto.

Ma, se si è disposti ad accettare la minaccia di un attacco del dizionario, MD5 e SHA1 sarebbero ciascuno 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top