Leggi Come fare in modo sicuro le password di hash? - non dovresti eseguire il rollover. @ThomasPornin ha una ottima risposta a questa domanda , e la sezione sulla generazione del sale include (tra molto più buoni consigli ) la seguente saggezza:
The main and only point of the salt is to be as unique as possible. Whenever a salt value is reused anywhere, this has the potential to help the attacker.
For instance, if you use the user name as salt, then an attacker (or several colluding attackers) could find it worthwhile to build rainbow tables which attack the password hashing function when the salt is "admin" (or "root" or "joe") because there will be several, possibly many sites around the world which will have a user named "admin". Similarly, when a user changes his password, he usually keeps his name, leading to salt reuse. snip
The cheap way to obtain uniqueness is to use randomness. If you generate your salt as a sequence of random bytes from the cryptographically secure PRNG that your operating system offers (/dev/urandom, CryptGenRandom()...) then you will get salt values which will be "unique with a sufficiently high probability". 16 bytes are enough so that you will never see a salt collision in your life, which is overkill but simple enough. snip
In sostanza, non è possibile utilizzare la password per generare un salt per la password, dal momento che l'input SOLO è la password!
- Quindi, un utente malintenzionato deve solo inserire "123456" nel proprio generatore di hash una sola volta, quindi troverà tutte le migliaia di utenti che lo hanno usato come password. Se avessi dei sali casuali, dovrebbero provare migliaia di volte (una volta per ogni combinazione di sale + password) per ottenere quelle migliaia di password deboli.
Dovresti utilizzare un generatore di numeri casuali per generare sali univoci per utente (e memorizzarli in testo in chiaro nel database, insieme all'hash della password e al numero di iterazioni o al fattore di lavoro utilizzato [così puoi facilmente aumentarlo in seguito] ), e il consiglio generale qui è approssimativamente un salt casuale di 16 byte. 8 byte è probabilmente un minimo pratico per la lunghezza del sale.