Vai al contenuto principale

Cos’è l’hashing

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.

Confronto tra gli algoritmi

AlgoritmoCaratteristicheUso consigliato
bcryptPuoi regolare il costo computazionale tramite il work factor (rounds). Predefinito.Applicazioni web comuni
argon2iPuoi regolare memoria, tempo e numero di thread. Robusto contro gli attacchi side-channel.Contesti con requisiti di sicurezza elevati
argon2idIbrido 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.

Flusso di hashing e verifica


Configurazione

Di default Laravel usa il driver bcrypt. Puoi cambiarlo tramite la variabile d’ambiente HASH_DRIVER.
# .env
HASH_DRIVER=bcrypt  # bcrypt / argon / argon2id
Per personalizzare la configurazione dell’hashing, pubblica il file di configurazione con config:publish.
php artisan config:publish hashing
Dopo la pubblicazione puoi modificare il work factor predefinito e altre opzioni in config/hashing.php.

Uso di base

Hashing di una password

Passando la password in chiaro a Hash::make() ottieni il valore hash. Questo valore va salvato nel database.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class PasswordController extends Controller
{
    public function update(Request $request): RedirectResponse
    {
        $request->validate([
            'password' => ['required', 'min:8', 'confirmed'],
        ]);

        $request->user()->fill([
            'password' => Hash::make($request->password),
        ])->save();

        return redirect('/profile');
    }
}
Salva il valore hash nel database ma non salvare mai la password in chiaro.

Regolare il work factor di bcrypt

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.
$hashed = Hash::make('plain-text-password', [
    'rounds' => 14,
]);

Regolare il work factor di Argon2

Con Argon2, puoi regolare il costo computazionale tramite le opzioni memory, time e threads.
$hashed = Hash::make('plain-text-password', [
    'memory'  => 65536, // in KiB
    'time'    => 4,
    'threads' => 2,
]);
OpzioneDescrizionePredefinito
memoryQuantità di memoria usata (KiB)65536
timeNumero di iterazioni4
threadsNumero di thread usati1
Per i dettagli sulle opzioni di Argon2 consulta la documentazione ufficiale di PHP.

Verifica delle password

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 password
if (! Hash::check($request->current_password, $request->user()->password)) {
    return back()->withErrors(['current_password' => 'La password corrente non è corretta.']);
}

Verifica del re-hashing

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 login
if (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.

Verifica dell’algoritmo di hashing

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.
# .env
HASH_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.

ObiettivoMetodo
Fare hashing di una passwordHash::make($password)
Verificare un hashHash::check($plain, $hash)
Controllare se serve rihashingHash::needsRehash($hash)
Cambiare il driver di hashingVariabile d’ambiente HASH_DRIVER
Disabilitare la verifica dell’algoritmoHASH_VERIFY=false

Prossimi passi

Introduzione all'autenticazione

Impara la panoramica dell’autenticazione, inclusa l’implementazione del login usando Hash::check().
Ultima modifica il 13 luglio 2026