L’hashing è il processo che, tramite una trasformazione unidirezionale, converte dati in chiaro (come le password) in una stringa di lunghezza fissa.
Dallo stesso input viene sempre generato lo stesso hash, ma non è possibile risalire al testo in chiaro a partire dall’hash.La facade Hash di Laravel supporta gli algoritmi di hashing bcrypt e Argon2 per la conservazione sicura delle password.
Puoi regolare il costo computazionale tramite il work factor (rounds). Predefinito.
Applicazioni web comuni
argon2i
Puoi regolare memoria, tempo e numero di thread. Robusto contro gli attacchi side-channel.
Contesti con requisiti di sicurezza elevati
argon2id
Ibrido tra argon2i e argon2d. Consigliato da PHC.
Progetti nuovi che vogliono usare Argon2
Il “work factor” di bcrypt controlla il tempo necessario per generare l’hash. Più l’hashing è lento, più aumenta la resistenza agli attacchi brute-force. Aumentando il work factor con l’evolvere dell’hardware puoi mantenere il livello di sicurezza.
Con l’opzione rounds puoi regolare il costo computazionale della generazione dell’hash. Valori più alti sono più sicuri ma richiedono più tempo di elaborazione.
Il valore predefinito (12) è adatto alla maggior parte delle applicazioni.
Con Hash::check() puoi verificare se una password in chiaro corrisponde all’hash salvato.
È il caso tipico d’uso all’interno del processo di login.
use Illuminate\Support\Facades\Hash;if (Hash::check($request->password, $user->password)) { // La password corrisponde} else { // La password non corrisponde}
Se usi Auth::attempt() questo processo è automatico e non devi chiamarlo direttamente.
Hash::check() è utile quando devi verificare manualmente la password corrente.
// Esempio: verifica della password corrente in un form di cambio passwordif (! Hash::check($request->current_password, $request->user()->password)) { return back()->withErrors(['current_password' => 'La password corrente non è corretta.']);}
Con Hash::needsRehash() puoi verificare se il work factor con cui è stato generato l’hash differisce dalla configurazione attuale.
Lo usi per aggiornare gli hash esistenti alla nuova configurazione dopo aver cambiato il work factor.
use Illuminate\Support\Facades\Hash;if (Hash::needsRehash($user->password)) { $user->update([ 'password' => Hash::make($plainTextPassword), ]);}
Esempio di re-hash effettuato al successo del login.
// Esegui il re-hash all'interno del processo di loginif (Auth::attempt($credentials)) { if (Hash::needsRehash(Auth::user()->password)) { Auth::user()->update([ 'password' => Hash::make($credentials['password']), ]); } return redirect()->intended('/dashboard');}
Rivedi periodicamente il work factor per adeguarlo al miglioramento delle prestazioni hardware, così da mantenere il livello di sicurezza. Sfruttando needsRehash() puoi aggiornare le password in modo naturale al momento del login degli utenti.
Per impostazione predefinita, Hash::check() verifica che l’hash sia stato generato con l’algoritmo attualmente configurato.
Se l’algoritmo è diverso viene lanciata una RuntimeException.In questo modo puoi prevenire attacchi basati sulla manomissione dell’algoritmo di hashing.Quando è necessario supportare più algoritmi contemporaneamente, ad esempio durante una migrazione, puoi disattivare questa verifica impostando HASH_VERIFY a false.
# .envHASH_VERIFY=false
Con HASH_VERIFY=false la verifica dell’algoritmo è disattivata. Usalo solo durante il periodo di migrazione e riportalo a true (predefinito) al termine.