Mentre altri hanno ben sottolineato che ci sono pochi (se del caso) vantaggi, vorrei contestare la tua affermazione secondo cui non ci sono svantaggi. Se memorizzi solo il nome utente con hash, la ricerca del nome utente è facile. Se si memorizza un nome utente salato e con hash, la ricerca diventa un po 'più problematica.
Supponiamo che se creiamo una tabella SQL contenente nomi utente e password (con hash) e diciamo al server SQL di indicizzare la colonna del nome utente che farà una sorta di ricerca binaria o qualche altra magia. Potremmo avere una tabella che assomiglia a:
Username | Passwordtest | j9lnvqjAuhNJs
(Questo è l'hash unix crypt (3) vecchia scuola solo per semplicità e brevità.)
Se memorizzi i tuoi nomi utente in testo normale, recuperando il ( hash) per un utente è una semplice chiamata SQL. Supponiamo che tu voglia convalidare le credenziali di un utente che ha digitato il nome utente test
:
SELEZIONA la password DAGLI utenti WHERE username = 'test`;
Abbastanza semplice. Ora, se dovessimo memorizzare i nomi utente nello stesso formato delle password, la nostra tabella finirebbe per avere questo aspetto:
Nome utente | PasswordM1CAtvzDdJDGU | j9lnvqjAuhNJs
Ora, quando un utente digita il proprio nome utente di test
, come convalidi 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 iterare su ogni nome utente nel database, crypt
inserendo il nome utente fornito con il salt per quel nome utente e confrontandolo con il nome utente memorizzato (con hash) per vedere se corrisponde. Youch!
Supponi di aver preso alcune buone precauzioni e di aver usato un hash lento e carino come bcrypt
invece della buona vecchia cripta Unix? Double youch!
Come puoi immaginare, ci sono alcuni seri inconvenienti nell'archiviare un nome utente con hash salato invece del semplice testo.