Come sottolineato da Johannes Gorset, il post di Thomas Ptacek di Matasano Security spiega perché le semplici funzioni di hashing per scopi generici come MD5, SHA1, SHA256 e SHA512 sono scelte di hashing password scadenti .
Perché? Sono troppo veloci: puoi calcolare almeno 1.000.000 di hash MD5 al secondo per core con un computer moderno, quindi la forza bruta è fattibile contro la maggior parte delle password che le persone usano. E questo è molto meno di un cluster di server cracking basato su GPU!
Salare senza allungare i tasti significa solo che non puoi precompilare la tabella arcobaleno, devi costruirla ad hoc per quel sale specifico. Ma non renderà le cose molto più difficili.
L'utente @Will dice:
Tutti ne parlano come se potessero essere hackerati su Internet. Come già detto, i tentativi di limitazione rendono impossibile decifrare una password su Internet e non hanno nulla a che fare con l'hash.
Non ne hanno bisogno. Apparentemente, nel caso di LinkedIn hanno utilizzato la comune vulnerabilità dell'iniezione SQL per ottenere la tabella DB di accesso e decifrare milioni di password offline.
Quindi torna allo scenario di attacco offline:
La sicurezza entra davvero in gioco quando l'intero database viene compromesso e un hacker può quindi eseguire 100 milioni di tentativi di password al secondo contro l'hash md5. SHA512 è circa 10.000 volte più lento.
No, SHA512 non è 10000 volte più lento di MD5 - richiede solo circa il doppio. Crypt / SHA512 , d'altra parte, è una bestia molto diversa che, come la sua controparte BCrypt, esegue lo stiramento delle chiavi , producendo un hash molto diverso con un sale casuale incorporato e impiegherà tra le 500 e le 999999 volte tanto da calcolare (lo stretching è sintonizzabile).
SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
Quindi la scelta per PHP è Crypt / Blowfish (BCrypt), Crypt / SHA256 o Crypt / SHA512. O almeno Crypt / MD5 (PHK). Vedi www.php.net/manual/en/function.crypt.php