Se si utilizza la password come "salt", non si utilizza affatto del sale; stai solo cancellando la password.
Se due utenti scelgono la stessa password, finiscono con la stessa password con hash. Questo è quello che viene spesso detto come se spiegasse il problema, ma sembra che molte persone sbagliano. Immaginano che questo significhi "collisione", che, per qualche motivo, è considerato da molti come una parolaccia quando si parla di hashing delle password. Ma questo è sbagliato, e non il punto.
Il punto è determinismo . Supponiamo che io, volentieri, prenda una copia delle password hash per 1000 utenti (ad esempio, ho recuperato un vecchio nastro di backup dal bidone della spazzatura). Quindi posso "provare" le potenziali password: ho cancellato una potenziale password (usando la password stessa come "salt") e poi cerco il valore tra i 1000 valori hash. Ciò significa che, pagando il prezzo computazionale dell'hash one , provo effettivamente mille coppie di utenti + password. Sto attaccando un migliaio di password con hash in parallelo, allo stesso costo di un singolo attacco. Questo tipo di parallelismo può esprimersi sotto diverse forme, comprese le tavole arcobaleno.
Lo preferiamo quando attacchi 1000 password hash costano 1000 volte il costo dell'attacco di 1 password hash. Per fare ciò, hai bisogno di veri sali, cioè sali che sono distinti per gli utenti distinti, anche quando capita di usare la stessa password - e, in realtà, quando potenzialmente usano la stessa password. Quando non c'è un vero sale, l'attacco parallelo non funziona perché alcuni utenti scelgono la stessa password, ma poiché se avevano scelto la stessa password allora avrebbero ottenuto il stesso valore hash. In realtà non hanno bisogno di scegliere la stessa password per innescare la debolezza.
Usare il nome utente come sale è molto meglio. Non va bene, attenzione! ma ancora meglio. Ciò che è ancora meglio, al punto di essere effettivamente decentemente sicuro, è usare sali casuali.