Questa sezione spiega le ragioni per cui usare le funzioni di hashing per proteggere le password, e come farlo in modo efficace.
Perché dovrei applicare l'hash alle password fornite dagli utenti?
L'hashing delle password è una delle considerazioni di sicurezza più basilari che devono essere fatte quando si progetta qualsiasi applicazione o servizio che accetta password dagli utenti. Senza hashing, qualsiasi password memorizzata può essere rubata se l'archivio dati viene compromesso, e poi usata immediatamente per compromettere non solo l'applicazione o il servizio, ma anche gli account degli utenti su altri servizi, se non usano password uniche.
Applicando un algoritmo di hashing alle password degli utenti prima di memorizzarle, diventa implausibile per qualsiasi attaccante determinare la password originale, pur essendo ancora in grado di confrontare l'hash risultante con la password originale in futuro.
È importante notare, tuttavia, che l'hashing delle password le protegge solo dall'essere compromesse nell'archivio dati, ma non le protegge necessariamente dall'essere intercettate da codice malevolo iniettato nell'applicazione o nel servizio stesso.
Perché le funzioni di hashing comuni come md5() e sha1() non sono adatte per le password?
Gli algoritmi di hashing come MD5, SHA1 e SHA256 sono progettati per essere
molto veloci ed efficienti. Con le tecniche moderne e l'equipaggiamento informatico,
è diventato banale fare brute force
sull'output di questi algoritmi,
per determinare l'input originale.
A causa della rapidità con cui un computer moderno può invertire
questi algoritmi
di hashing, molti professionisti della sicurezza sconsigliano fortemente
il loro uso per l'hashing delle password.
Come dovrebbero essere hashate le password, se le funzioni di hash comuni non sono adatte?
Quando si hashano le password, le due considerazioni più importanti sono il costo computazionale e il salt. Più è computazionalmente costoso l'algoritmo di hashing, più tempo ci vorrà per fare brute force sul suo output.
PHP fornisce un'API nativa per l'hashing delle password che gestisce in modo sicuro sia l'hashing che la verifica delle password in modo sicuro.
L'algoritmo suggerito da usare per l'hashing delle password è Blowfish, che è anche il default usato dall'API di hashing delle password, poiché è significativamente più costoso computazionalmente rispetto a MD5 o SHA1, pur rimanendo scalabile.
La funzione crypt() è anche disponibile per l'hashing delle password, ma è raccomandata solo per l'interoperabilità con altri sistemi. Invece, è fortemente incoraggiato l'uso dell' API nativa per l'hashing delle password quando possibile.
Cos'è un salt?
Un salt crittografico è un dato che viene applicato durante il processo di hashing per eliminare la possibilità che l'output venga cercato in una lista di coppie pre-calcolate di hash e relativi input, nota come rainbow table.
In termini più semplici, un salt è un po' di dati aggiuntivi che rende gli hash significativamente più difficili da craccare. Ci sono diversi servizi online che forniscono liste estese di hash pre-calcolati, così come l'input originale per quegli hash. L'uso di un salt rende implausibile o impossibile trovare l'hash risultante in una di queste liste.
password_hash() creerà un salt casuale se non ne viene fornito uno, e questo è generalmente l'approccio più semplice e sicuro.
Come vengono memorizzati i salt?
Quando si usa password_hash() o crypt(), il valore restituito include il salt come parte dell'hash generato. Questo valore dovrebbe essere memorizzato così com'è nel database, poiché include informazioni sulla funzione hash che è stata usata e può quindi essere passato direttamente a password_verify() quando si verificano le password.
password_verify() dovrebbe sempre essere usato invece di ri-hashare e confrontare il risultato con un hash memorizzato per evitare attacchi di timing.
Il seguente diagramma mostra il formato di un valore restituito da crypt() o password_hash(). Come si può vedere, sono auto-contenuti, con tutte le informazioni sull'algoritmo e sul salt necessarie per la futura verifica della password.