Come cifrare e decifrare valori con la facade Crypt di Laravel usando AES-256-CBC. Copre la generazione di APP_KEY, i cast dei modelli e il salvataggio sicuro di dati personali.
Il servizio di cifratura di Laravel offre una semplice interfaccia per cifrare e decifrare valori usando la cifratura OpenSSL AES-256-CBC (o AES-128-CBC).Tutti i valori cifrati con Laravel sono firmati con un Message Authentication Code (MAC).
Se il valore cifrato viene manomesso, non è più possibile decifrarlo.
Prima di usare la cifratura è necessaria la configurazione key di config/app.php.
Questo valore viene letto dalla variabile d’ambiente APP_KEY.Usa il comando php artisan key:generate per generare una chiave sicura.
Viene generata una chiave crittograficamente sicura usando il generatore di numeri casuali sicuro di PHP.
php artisan key:generate
Di norma viene generata automaticamente durante l’installazione di Laravel. La chiave generata viene salvata nel file .env.
Cambiando la chiave di cifratura, tutte le sessioni utente autenticate vengono terminate.
Questo perché Laravel cifra tutti i cookie, inclusi i cookie di sessione.Inoltre, i dati cifrati con la chiave precedente non potranno più essere decifrati.Per mitigare il problema, puoi elencare le chiavi precedenti in APP_PREVIOUS_KEYS, separate da virgola.
Laravel usa sempre la chiave corrente per cifrare. In fase di decifratura, se la chiave corrente fallisce, prova in ordine quelle precedenti.
In questo modo gli utenti possono continuare a usare l’applicazione durante la rotazione delle chiavi.
Usa il metodo encryptString della facade Crypt per cifrare un valore.
Il valore cifrato usa OpenSSL con cifratura AES-256-CBC e viene firmato con un MAC.
<?phpnamespace App\Http\Controllers;use Illuminate\Http\RedirectResponse;use Illuminate\Http\Request;use Illuminate\Support\Facades\Crypt;class DigitalOceanTokenController extends Controller{ /** * Salva il token API dell'utente */ public function store(Request $request): RedirectResponse { $request->user()->fill([ 'token' => Crypt::encryptString($request->token), ])->save(); return redirect('/secrets'); }}
encryptString cifra la stringa senza serializzazione. Per cifrare oggetti o array usa encrypt.
Metodo
Uso
Crypt::encryptString($value)
Cifra la stringa così com’è
Crypt::encrypt($value)
Serializza il valore e poi lo cifra (supporta array/oggetti)
Con il metodo decryptString della facade Crypt decifri un valore.
Se la decifratura non riesce (ad esempio MAC non valido) viene lanciata DecryptException.
use Illuminate\Contracts\Encryption\DecryptException;use Illuminate\Support\Facades\Crypt;try { $decrypted = Crypt::decryptString($encryptedValue);} catch (DecryptException $e) { // Gestione del fallimento della decifratura abort(400, 'Dati non validi.');}
Schema::create('profiles', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained(); $table->text('tax_code')->nullable(); // Valore cifrato salvato come text $table->text('bank_account')->nullable(); $table->timestamps();});