Il problema qui è che la missione di sale non deve essere "segreta", lo scopo è essere unico quindi quando un utente malintenzionato "prova una password" con quel sale noto può solo confrontare il passaggio generato con questo originale hash perché tutte le altre password avranno hash diversi.
Ad esempio:
Considera di non avere sale:
user1:hashpass1
user2:hashpass2
user3:hashpass3
user4:hashpass1
user5:hashpass5
Come puoi vedere, user1 e user4 usano la stessa password perché l'hash generato è identico. Quindi, quando un utente malintenzionato lo trova, può pronunciare una sola parola comune, ad esempio: "coniglio" e confrontare il coniglio con l'intero database di hash delle password. Saprà anche che tutti gli hash identici sono stati generati con la stessa password.
Questo è ottimo per un utente malintenzionato perché ha solo bisogno di hash UNA volta per confrontarlo con l'hash sull'intero database.
D'altra parte, considera la stessa tabella utente salata
user1:salt1:salted1hashpass1
user2:salt2:salted1hashpass2
user3:salt3:salted1hashpass3
user4:salt4:salted4hashpass1
user5:salt5:salted1hashpass5
Ora tutti gli hash delle password sono diversi a causa del sale, anche user1 e user4 che hanno usato la stessa password hanno hash diversi.
Questa è una cattiva notizia per un attaccante che dovrà calcolare la parola coniglio con ogni singolo sale che trova nel database, quindi avrà molto tempo per farlo. E questo è il vero valore aggiunto dal sale.