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
Crittografia
Introduzione
I servizi di crittografia di Laravel offrono un’interfaccia semplice e comoda per crittografare e decrittografare testo tramite OpenSSL utilizzando la crittografia AES-256 e AES-128. Tutti i valori crittografati di Laravel sono firmati utilizzando un codice di autenticazione del messaggio (MAC) in modo che il loro valore sottostante non possa essere modificato o manomesso una volta crittografato.
Configurazione
Prima di utilizzare l’encrypter di Laravel, devi impostare l’opzione di configurazione key
nel file di configurazione config/app.php
. Questo valore di configurazione è determinato dalla variabile d’ambiente APP_KEY
. Dovresti usare il comando php artisan key:generate
per generare il valore di questa variabile, poiché il comando key:generate
utilizzerà il generatore di byte casuali sicuri di PHP per creare una chiave crittograficamente sicura per la tua applicazione. Di solito, il valore della variabile d’ambiente APP_KEY
verrà generato automaticamente durante l’installazione di Laravel.
Rotazione Graduale delle Chiavi di Crittografia
Se cambi la chiave di crittografia della tua applicazione, tutte le sessioni utente autentificate verranno disconnesse. Questo perché ogni cookie, inclusi quelli di sessione, sono crittografati da Laravel. Inoltre, non sarà più possibile decrittografare i dati crittografati con la chiave precedente.
Per evitare questo problema, Laravel consente di elencare le chiavi di crittografia precedenti nella variabile d’ambiente APP_PREVIOUS_KEYS
della tua applicazione. Questa variabile può contenere una lista separata da virgole di tutte le chiavi di crittografia precedenti:
APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="
APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2ax3EF2Lyq/hH6QghBGLIq5uL+Gp8/w="
Impostando questa variabile d’ambiente, Laravel utilizzerà sempre la chiave di crittografia "corrente" per crittografare i valori. Tuttavia, per decrittografare i valori, Laravel proverà prima con la chiave corrente e, se fallisce, tenterà tutte le chiavi precedenti fino a trovare quella giusta.
Questo metodo di decrittografia graduale consente agli utenti di continuare a usare la tua applicazione senza interruzioni anche se la chiave di crittografia viene cambiata.
Utilizzo dell’Encrypter
Crittografare un Valore
Puoi crittografare un valore utilizzando il metodo encryptString
fornito dalla facade Crypt
. Tutti i valori crittografati utilizzano OpenSSL e il cifrario AES-256-CBC. Inoltre, tutti i valori crittografati sono firmati con un codice di autenticazione del messaggio (MAC). Il codice di autenticazione integrato impedirà la decrittografia di qualsiasi valore che è stato manomesso da utenti malintenzionati:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;
class DigitalOceanTokenController extends Controller
{
/**
* Memorizza un token API di DigitalOcean per l'utente.
*/
public function store(Request $request): RedirectResponse
{
$request->user()->fill([
'token' => Crypt::encryptString($request->token),
])->save();
return redirect('/secrets');
}
}
Decifrare un Valore
Puoi decifrare i valori utilizzando il metodo decryptString
fornito dalla facade Crypt
. Se il valore non può essere decifrato correttamente, ad esempio quando il codice di autenticazione del messaggio non è valido, verrà lanciata un’Illuminate\Contracts\Encryption\DecryptException
:
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;
try {
$decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
// ...
}