Mentre altri hanno ben evidenziato che ci sono pochi (se non nessuno) vantaggi, vorrei prendere in considerazione la tua affermazione che non ci sono degli inconvenienti. Se memorizzi solo il nome utente con hash, cercare il nome utente è facile. Se memorizzi un nome utente hash salato, la ricerca diventa un po 'più problematica.
Supponiamo che se costruiamo una tabella SQL contenente nomi utente e password (hash) e dica al server SQL di indicizzare la colonna username che farà una sorta di ricerca binaria o altra magia. Potremmo avere una tabella simile a:
Username | Password
test | j9lnvqjAuhNJs
(Questo è l'hash di unix crypt (3) vecchia scuola solo per semplicità e brevità.)
Se si memorizzano i nomi utente in testo semplice, il recupero della password (con hash) per un utente è una semplice chiamata SQL. Supponiamo che tu voglia convalidare le credenziali per un utente che ha digitato il nome utente test
:
SELECT password FROM users WHERE username='test';
Semplice abbastanza. Ora, se dovessimo memorizzare i nomi utente nello stesso formato delle password, la nostra tabella risulterebbe così:
Username | Password
M1CAtvzDdJDGU | j9lnvqjAuhNJs
Ora, quando un utente digita il proprio nome utente di test
, come si convalida la password? Una ricerca binaria è inutile qui, dal momento che non conosci nemmeno il sale che hai usato per memorizzare il nome utente. Invece, è necessario scorrere su ogni nome utente nel database, crypt
ing il nome utente indicato con il sale per quel nome utente e confrontarlo con il nome utente memorizzato (hash) per vedere se corrisponde. Youch!
Supponi di aver preso alcune buone precauzioni e hai usato un bel hash lento come bcrypt
invece della buona vecchia critto Unix? Double youch!
Come puoi immaginare, ci sono alcuni seri svantaggi nell'archiviazione di un nome utente con hash salato invece di solo testo in chiaro.