2010-03-31 10 views
18

Dati i punti deboli noti dell'MD5 e le recenti debolezze (maggio 2009) discusse in SHA1, come dovrebbero essere salati i nuovi programmi & con le loro password?Qual è l'algoritmo di hashing consigliato da utilizzare per le password memorizzate?

Ho visto SHA-256 e SHA-512 suggerito.

Programmazione prevalentemente in Ruby on Rails e utilizzo di PostgreSQL - ma altri linguaggi e ambienti potrebbero anche dover calcolare gli hash delle password.

+2

Grazie Martin, capisco che. Era una domanda ristretta e meritava una risposta ristretta. – Hissohathair

risposta

21

SHA-256 e SHA-512 sono sicuri per il futuro prevedibile. Appartengono alla famiglia SHA-2, contro la quale finora non sono stati identificati attacchi. This wikipedia page dice che i venditori Unix e Linux si stanno ora trasferendo a SHA-2 per il loro hashing sicuro di password. La famiglia SHA-3, con algoritmi ancora più potenti, è in fase di sviluppo, ma non sarà pronta almeno fino al 2012.

P.S: A meno che non stiate nascondendo i nomi degli agenti segreti dei governi, sarete al sicuro anche con SHA-1, ma se non si tratta di implementare SHA-2, basta usare quello.

+2

PKCS # 5 (http://www.rsa.com/rsalabs/node.asp?id=2127) discute alcune altre buone informazioni (come le iterazioni) che il lettore potrebbe voler prendere in considerazione. – atk

+2

SHA-1 è considerato guasto. –

+0

@Noon Silk: quanta potenza di calcolo è attualmente necessaria per romperlo? –

17

Utilizzare una funzione lenta come bcrypt. Here è un post dei ragazzi di Phusion.

-4

è necessario utilizzare un nome utente hash, la password e il sale, come:

hash(length(username)+"_veryuniquesalt4rtLMAO"+username+password) 

In questo modo, il database non è vulnerabile a eventuali tabelle arcobaleno esistenti, a causa del sale, e con il nome utente hash lungo con la password è anche impossibile creare una tabella arcobaleno per il tuo specifico metodo di hashing.

Utilizzando un "lento" algoritmo di hash garantirà le password meglio, proprio come se fossero più complesse, ma è un compromesso, una volta che avete deciso su un certo livello di lentezza non si può semplicemente scalare indietro quando si bisogno di prestazioni per altre cose

È anche possibile eseguire il client di hashing lento utilizzando JavaScript, in questo modo non si verificherà un problema di prestazioni, ma il metodo richiederà ovviamente che JavaScript sia abilitato.

Qualsiasi cosa scegliate, un po 'di rallentamento è molto meglio di niente, usate 1 millisecondo invece di 1 microsecondo e la vostra protezione è 1000 volte più forte.

Puoi usare bcrypt, oppure puoi fare un algoritmo di hashing convenzionale molto lavoro extra, ma assicurati che il lavoro extra non sia principalmente la concatenazione di stringhe.

Alla fine, è meglio non rubare il database, molte password sono così deboli da essere facilmente estratte, qualunque cosa tu faccia.

+2

Nota che includere il nome utente nell'hash impedisce di modificare il nome utente. In base ai requisiti di sistema, questo può essere o non essere desiderabile. se non è desiderabile, l'uso di uid (o guid o equivalente) sarebbe un'alternativa. – atk

+1

Devi solo fare in modo che l'utente inserisca la sua password per cambiare nome utente, best practice comunque. – aaaaaaaaaaaa

+2

c'è un bug molto sottile nel codice: dovresti * mai * concatre i dati in un hash. H (x + y + z) ti apre fino a un attacco di estensione della lunghezza. Piuttosto dovresti: H (H (x + y + z)) o H (H (x) + H (y) + H (z)) –

7

È necessario utilizzare una funzione di derivazione della chiave basata su password come risultato uid/pwd; il più noto è PBKDF2 http://en.wikipedia.org/wiki/PBKDF2 definito anche come RFC 2898 http://tools.ietf.org/html/rfc2898. PKBDF2 prende i tuoi dati segreti oltre a un conteggio salato e un numero di iterazioni. Questo è il modo standard per risolvere il tuo problema.

Se si programma in .NET, utilizzare Rfc2898DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

+1

Ho appena letto 100 articoli e domande sull'argomento, e sembra essere d'accordo sul fatto che RFC2898 o qualsiasi altra soluzione di multi-iterazione (ad esempio BCrypt) sia la strada da percorrere. Ma Rfc2898DeriveBytes è basato su SHA-1, no? Non è obsoleto? E BCrypt non sembra "convalidato", anche se sembra fantastico. Inoltre, Rfc2898DeriveBytes non implementa IDisposable, sembra che potrebbe perdere facilmente la password in chiaro in memoria. I miei reali bisogni non sono paranoici, ma voglio misurare la sicurezza di ogni cosa. Quale sarebbe la tua opinione su questo? Grazie! –

Problemi correlati