Ci sono quattro problemi con l'iterazione di md5 ripetutamente, non importa quante volte lo fai.
Computing Power over Time
Il primo grosso problema qui è che, come scritto, non si ridimensiona nel tempo per rimanere al sicuro man mano che i computer diventano più veloci. Ciò che è sicuro oggi sarà rotto nei momenti nei computer di domani.
Algoritmi sicuri moderni come bcrypt e scrypt sono integrati nel tuning in modo che l'algoritmo possa essere regolato automaticamente per essere più lento man mano che i computer che attaccano diventano più veloci. Poiché bcrypt è anche gratuito ed è ancora una semplice funzione chiamata per te, non c'è alcun buon motivo per non usarlo.
Ora hai start di una struttura di scalabilità integrata nel tuo codice. Sarebbe facile refactoring per eseguire l'hash MD5 un numero arbitrario di volte, in modo da poterlo regolare più lentamente nel tempo. Ma non è abbastanza buono.
Progettato per l'errore
Il secondo problema è che md5 è una scelta fondamentalmente povera per un hash crittografico perché è stato specificamente progettato per essere veloce . Lo scopo di MD5 è quello di verificare o confrontare rapidamente file di grandi dimensioni. Per fare ciò, l'hash deve essere in grado di essere calcolato rapidamente ed efficientemente. Ciò significa che gli obiettivi di implementazione e progettazione dell'algoritmo sono completamente in disaccordo con l'archiviazione delle password. Le probabilità che a un certo punto capiremo un modo per calcolare un hash MD5 che sia più veloce di quello che possiamo fare attualmente è di ordini di grandezza superiore a quello che saremo in grado di fare lo stesso per sha1 o bcrypt.
Degenerazione
Il terzo problema è che gli algoritmi di hashing in generale tendono a degenerare man mano che vengono iterati. Per capire questo, prendi il testo originale fornito dall'utente. La dimensione concettuale di questo testo è illimitata . Qui c'è un infinito numero di valori possibili. Dopo aver cancellato il testo una volta con md5, siamo al 2 128 numero di valori possibili ... ancora molto grandi, ma non più illimitati. Ma andiamo di nuovo in ciclo. md5 è buono, ma non è perfetto . Quei potenziali 340 undecillion avranno delle collisioni e produrranno un numero di risultati vicino, ma ancora un po 'meno di, 2 128 . Continuando a scorrere, troverai più collisioni, finché alla fine non troverai un numero che, pur essendo ancora grande, è significativamente inferiore allo spazio concettuale con cui hai pensato di lavorare.
Cicli
Infine, il quarto problema è che alcuni dei tuoi potenziali input iniziali risulteranno in cicli : numero di valore 12345 hash su 98743, hash su 67321, hash su 12345 e così via. In altre parole, alcuni input passeranno in rassegna lo stesso piccolo insieme di valori hash, e iterandoli ulteriormente non aiuterà . Infatti, più volte esegui l'hash, più probabilmente un dato input originale finirà in un ciclo.
Questo torna al design di md5. Un hash crittografico potrebbe essere progettato per minimizzare (non eliminare completamente, ma almeno minimizzare) i fenomeni di degenerazione e di ciclo, ma non era affatto un problema per MD5.
Conclusione
Qualcuno di questi motivi è sufficiente per non usare md5. Ci sono altre opzioni perfettamente valide disponibili e generalmente usano la stessa interfaccia, quindi sceglierne una diversa non è difficile. In alcune piattaforme, è facile come modificare un valore enum che passi ad alcune funzioni di "createhash". Metti insieme tutti e tre i motivi, e continuare a usare md5 è assolutamente folle.