Prologo
Primi Passi
Architettura
Le Basi
- Routing
- Middleware
- Protezione da CSRF
- Controller
- Richieste
- Risposte
- Views
- Blade
- Vite
- URL
- Sessioni
- Validazione
- Errori
- Logging
Approfondimenti
- Artisan
- Broadcasting
- Cache
- Collezioni
- Concorrenza
- Contesto
- Contratti
- Eventi
- File System
- Helpers
- Client HTTP
- Localizzazione
- Notifiche
- Sviluppo di Package
- Processi
- Code
- Rate-limiting
- Stringhe
- Scheduling di Task
Sicurezza
Database
Eloquent ORM
Testing
Package
Hashing
Introduzione
La Hash
facade di Laravel offre hashing sicuro con Bcrypt e Argon2 per memorizzare le password degli utenti. Se utilizzi uno dei starter kit per applicazioni Laravel, Bcrypt verrà usato di default per la registrazione e l’autenticazione.
Bcrypt è una scelta eccellente per l’hashing delle password perché il suo "work factor" è regolabile, il che significa che il tempo necessario per generare un hash può aumentare con l’aumentare della potenza hardware. Quando si hashano le password, la lentezza è positiva. Più un algoritmo impiega tempo per hashare una password, più tempo ci vuole agli utenti malintenzionati per creare "rainbow tables" di tutti i possibili valori hash delle stringhe che potrebbero essere usate in attacchi di forza bruta contro le applicazioni.
Configurazione
Per impostazione predefinita, Laravel utilizza il driver di hashing bcrypt
per l’hashing dei dati. Tuttavia, sono supportati diversi altri driver di hashing, tra cui argon
e argon2id
.
Puoi specificare il driver di hashing della tua applicazione utilizzando la variabile d’ambiente HASH_DRIVER
. Se invece vuoi personalizzare tutte le opzioni del driver di hashing di Laravel, dovresti pubblicare il file di configurazione completo hashing
usando il comando Artisan config:publish
:
php artisan config:publish hashing
Utilizzo di Base
Hash delle Password
Puoi creare un hash per una password chiamando il metodo make
sul facade Hash
:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
{
/**
* Aggiorna la password per l'utente.
*/
public function update(Request $request): RedirectResponse
{
// Valida la lunghezza della nuova password...
$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
return redirect('/profile');
}
}
Regolare il Fattore di Lavoro di Bcrypt
Se stai utilizzando l’algoritmo Bcrypt, il metodo make
ti permette di gestire il fattore di lavoro dell’algoritmo usando l’opzione rounds
; tuttavia, il fattore di lavoro predefinito gestito da Laravel è accettabile per la maggior parte delle applicazioni:
$hashed = Hash::make('password', [
'rounds' => 12,
]);
Regolare il Fattore di Lavoro di Argon2
Se stai usando l’algoritmo Argon2, il metodo make
ti permette di gestire il fattore di lavoro dell’algoritmo utilizzando le opzioni memory
, time
e threads
; tuttavia, i valori predefiniti gestiti da Laravel sono accettabili per la maggior parte delle applicazioni:
$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
[!NOTE]
Per maggiori informazioni su queste opzioni, consulta la documentazione ufficiale di PHP relativa all’hashing Argon.
Verificare che una password corrisponda a un hash
Il metodo check
fornito dalla facade Hash
ti permette di verificare se una stringa in chiaro corrisponde a un determinato hash:
if (Hash::check('plain-text', $hashedPassword)) {
// Le password corrispondono...
}
Determinare se una Password Deve essere Rihashata
Il metodo needsRehash
fornito dalla façade Hash
permette di verificare se il fattore di lavoro utilizzato dall’hashatore è cambiato da quando la password è stata hashata. Alcune applicazioni scelgono di eseguire questo controllo durante il processo di autenticazione dell’applicazione:
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}
Verifica dell’Algoritmo di Hash
Per evitare la manipolazione dell’algoritmo di hash, il metodo Hash::check
di Laravel verificherà prima che l’hash fornito sia stato generato usando l’algoritmo di hashing selezionato dall’applicazione. Se gli algoritmi sono diversi, verrà lanciata un’eccezione RuntimeException
.
Questo comportamento è quello previsto per la maggior parte delle applicazioni, dove l’algoritmo di hashing non dovrebbe cambiare e algoritmi differenti possono indicare un attacco malevolo. Tuttavia, se hai bisogno di supportare più algoritmi di hashing nella tua applicazione, ad esempio quando migri da un algoritmo all’altro, puoi disabilitare la verifica dell’algoritmo di hash impostando la variabile di ambiente HASH_VERIFY
su false
:
HASH_VERIFY=false