hashing della password è un compromesso: tu rendere la funzione più lenta (usando molte iterazioni), il che rende più costosi sia gli attacchi che l'uso normale. Accetti di dedicare più CPU al compito di verificare una password perché sai che farà anche in modo che l'hacker spenda più CPU per il cracking di una password. Una decente funzione di hashing della password offre un parametro "costo" che consente di impostare la lentezza della funzione al livello migliore, ovvero la più costosa che è possibile tollerare, per le risorse disponibili e il carico medio.
Se esegui l'hashing X volte, rendi l'utilizzo X più lento, sia per te che per l'aggressore. In pratica, ciò significa che è necessario ridurre il conteggio delle iterazioni della funzione di un fattore di X , per mantenere il calcolo all'interno del proprio budget hardware e questo annulla esattamente qualsiasi guadagno di sicurezza. Quindi, da questo punto di vista, il tuo meccanismo proposto è semplicemente neutrale rispetto alla sicurezza (tranne che aumenta la complessità dell'implementazione, che è, a parità di condizioni, una cosa negativa).
C'è ancora un punto interessante da considerare, che è la casualità di X . Supponiamo di generare X a caso, tra 5 e 15. In media, X sarà uguale a 10; quando si convalida una password (corretta), è necessario calcolare la funzione di hashing circa 10 volte (in media). Tuttavia, per decidere che una password non è corretta, devi andare a 15.
Potremmo dire: hey, va bene! Il defender (il tuo server), in condizioni di utilizzo normale, convalida la maggior parte delle password corrette (gli utenti tendono a digitare correttamente le loro password (*)), mentre l'attacker, nel suo attacco di dizionario, tenterà la maggior parte delle volte di utilizzare password errate. Quindi l'attaccante spenderà 1,5 volte più CPU per ogni tentativo di password rispetto al difensore. Abbiamo appena guadagnato un fattore 1.5x rispetto all'attaccante! Non si gonfia?
Non così. L'attaccante è a conoscenza del tuo meccanismo "casuale X " e organizzerà il suo attacco di conseguenza. Cioè, egli cancellerà le parole nel suo dizionario con 5 invocazioni di hashing, registrando i valori hash (nella RAM - stiamo parlando solo di milioni di valori hash qui, o forse di un paio di miliardi, niente di estremo). Se uno dei valori hash si adatta, va bene, l'attaccante ha vinto. In caso contrario, calcolerà un'ulteriore invocazione hash su ciascun valore registrato e riproverà. E così via.
In questo modo, l'attaccante otterrà anche lo stesso tipo di efficienza del difensore: anche lui creerà una password con un costo (in media) 10 volte il costo di invocare la funzione hash. Quindi, ancora una volta, il vantaggio di sicurezza del X casuale è annullato.
(*) Questa è una nozione piuttosto ottimistica.
Riepilogo: il fattore X , casuale o meno, non aumenta la sicurezza. Implementato correttamente, non dovrebbe ridurlo molto, ma poiché rende il codice più complesso e rende anche il carico meno prevedibile, posso solo sconsigliare quel meccanismo extra.