Ciò che è male nel rivelare la password hash-and-salt è che permette attacchi dizionario offline : poiché la password hash e the salt sono sufficienti per verificare una potenziale password, quindi, per definizione, consentono a un utente malintenzionato di provare le password sulle proprie macchine, limitate solo dal numero di PC (o altro hardware) che può radunare. Ciò contrasta con gli attacchi al dizionario online , in cui ogni tentativo deve passare attraverso il server e il tuo server non accetterà di provare miliardi di password al secondo.
L'hashing della password è una seconda linea di difesa . Non vuoi che gli aggressori ottengano informazioni sufficienti per eseguire attacchi di dizionario offline; ma quando lo fanno, almeno lo preferisci se devono pagare l'intero prezzo dell'attacco, cioè mostra solo hash delle password , non le password stesse. Inoltre, si desidera una funzione hash lenta (con milioni di iterazioni) e il sale per prevenire attacchi paralleli e altre ottimizzazioni simili (come le tabelle precompiate).
Tutto ciò riguarda la protezione delle password , come in "dati segreti che gli utenti umani ricordano". Essendo il cervello umano quello che sono, le password tendono ad essere vulnerabili agli attacchi del dizionario. Tuttavia, se riesci a convincere i tuoi utenti umani a ricordare sequenze di 20 lettere casuali (sequenze non che scelgono da sole, ma lettere generate casualmente), allora puoi mostrare i valori hash, perché le password sufficientemente casuali sono comunque fuori dalla portata degli attacchi al dizionario - probabilmente non sono più password ma chiavi . Nota che non si tratta di lunghezza ma di casualità : una password non è strong perché è lunga, ma perché è stata prodotta con abbastanza casualità in essa; hai solo bisogno di lunghezze per fare spazio alla casualità.
Se hai bisogno di un riferimento per colpire i non credenti , quindi invoca Pubblicazione speciale del NIST SP 800-118 (ancora in bozza, ma comunque pubblicata), che include in particolare questa citazione (dal" sommario esecutivo "):
Password
cracking attacks can be mitigated by using strong
passwords, choosing strong cryptographic algorithms
and implementations for password hashing, and protecting the confidentiality of password hashes.
(L'enfasi è mia.)
L'hashing della password è un'arte difficile. Dici che usi "HMAC / SHA-1", ma HMAC non è una funzione di hash; è un algoritmo MAC . Gli algoritmi MAC utilizzano un tasto . Quello che probabilmente significa è che si utilizza una funzione di hashing della password che è stata progettata su una o più invocazioni di HMAC / SHA-1 come un blocco predefinito. PBKDF2 è una funzione di hashing della password. Include un parametro aggiuntivo che è il numero di iterazioni e questo è importante.
Vedi questa risposta per una discussione dettagliata sulla password hashing, la sua teoria e la sua pratica.