In generale, non è necessario utilizzare più di un algoritmo di hashing.
Quello che devi fare è:
Usa salt: salt non è usato solo per rendere la tua password più sicura , è usato per sottrarre attacchi da tavolo arcobaleno. In questo modo, qualcuno avrà un lavoro più duro cercando di pre-calcolare l'hash per le password che memorizzi nel tuo sistema.
Usa interazioni multiple: invece di fare solo SHA (password + salt), esegui SHA (SHA (SHA (SHA (SHA (SHA (password + salt)))))). Oppure, per rappresentare in altro modo:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
E, infine, scegli una buona funzione di hashing. SHA, MD5, ecc. Non vanno bene perché sono troppo veloci . Dal momento che si desidera utilizzare l'hash per la protezione, è meglio utilizzare hash più lenti. Dai un'occhiata a Bcrypt , PBKDF2 o Scrypt , per esempio.
modifica : dopo le osservazioni, proviamo a vedere alcuni punti (scusate, lunga spiegazione per arrivare alla fine, perché potrebbe aiutare gli altri a cercare risposte simili):
Se il tuo sistema è sicuro, come nessuno potrà mai accedere alla password memorizzata, non avrai bisogno di hash. La password sarebbe segreta, nessuno l'avrebbe ottenuta.
Ma nessuno può assicurare che il database con le password verrà rubato. Ruba il database, ottieni tutte le password. Ok, il tuo sistema e la tua azienda ne soffriranno tutte le conseguenze. Quindi, potremmo provare a evitare questa perdita di password.
AVVISO che a questo punto non siamo preoccupati per gli attacchi online. Per un attacco online, la soluzione migliore è rallentare dopo password errate, bloccare l'account dopo alcuni tentativi, ecc. E per questo non importa in che modo crittografare, hash, archiviare, ecc., La password. L'attacco online è una questione di rallentamento degli input della password .
Quindi, tornando al don't let them take my plain passwords
problema. La risposta è semplice: non archiviarli come testo normale. Ok capito.
Come evitarlo?
Crittografa la password (?). Ma, come sapete, se lo crittografate, è possibile decrittografarlo nuovamente, se si dispone della chiave corretta. E finirai con il problema di "dove nascondere" la chiave. Hum, non va bene, dato che ti hanno dato il database, possono ottenere la tua chiave. Ok, non usiamolo.
Quindi, un altro approccio: trasformiamo la password in qualcos'altro che non può essere invertito e salviamola. E per verificare se la password fornita è corretta, eseguiamo nuovamente lo stesso processo e controlliamo se i due valori trasformati corrispondono. Se corrispondono = è stata fornita la password corretta.
Ok, finora tutto bene. Usiamo un po 'di hash MD5 nella password. Ma ... se qualcuno ha il nostro valore hash di password memorizzato, può avere molta potenza del computer per calcolare l'hash MD5 di ogni possibile password (forza bruta), in modo che possa trovare la password originale. O, peggio ancora, può memorizzare tutto l'MD5 da tutte le combinazioni di caratteri e trovare facilmente la password. Quindi, fai molte iterazioni, la cosa HASH (HASH (HASH ())), per renderla più difficile, perché ci vorrà più tempo.
Ma anche questo può essere evitato, il tavolo arcobaleno è stato creato esattamente per accelerare questo tipo di protezione.
Quindi, usiamo un po 'di sale su di esso. In questo modo, ad ogni interazione, il sale viene riutilizzato. Uno che prova ad attaccare le tue password dovrà generare la tabella arcobaleno considerando che il sale viene aggiunto ogni volta. E quando genera quella tabella arcobaleno, poiché è stata generata con un solo sale, dovrà calcolare nuovamente con l'altro sale, quindi dovrà dedicare un po 'di tempo per ogni password (= ogni sale). Salt non aggiungerà "più complessità" alla password, farà perdere tempo all'attaccante generando la tabella arcobaleno, se usi un salt per ogni password, la tabella da un salt è inutile per un'altra password.
E l'utilizzo di più di un hash ti ha aiutato qui? No. La persona che genera un attacco arcobaleno specifico sarà in grado di generarlo utilizzando uno o più hash, comunque.
E usare più di un hash può portare a un problema: è sicuro come l'hash più debole che usi. Se qualcuno trova delle collisioni in un algoritmo di hash, è quell'hash che verrà sfruttato, in qualsiasi momento del processo di iterazione, per violare la password. Quindi, non ottieni nulla usando più algoritmi di hash, è meglio scegliere solo un buon algoritmo. e usalo. E se mai sapessi che è stato rotto, pensa a come lo cambierai nella tua applicazione.
E perché usare bcrypt o qualcosa del genere (dici di usarlo): perché l'attaccante dovrà impiegare più tempo a generare le tabelle. Ecco perché l'uso di MD5 + wait (3 secondi) non aiuta: l'attacco sarà offline, comunque, così l'attaccante può generare le tabelle senza il (ritardo di 3 secondi).