Erläutert, wie Sie Werte mithilfe der Crypt-Facade in Laravel per AES-256-CBC verschlüsseln und wieder entschlüsseln. Enthält Themen wie APP_KEY-Erzeugung, Model-Casts und die sichere Ablage personenbezogener Daten.
Der Verschlüsselungsdienst von Laravel stellt eine einfache Schnittstelle zur Verfügung, um Werte per OpenSSL und AES-256-CBC (bzw. AES-128-CBC) zu ver- und entschlüsseln.Alle in Laravel verschlüsselten Werte werden mit einem Message Authentication Code (MAC) signiert.
Wird ein verschlüsselter Wert manipuliert, lässt er sich damit nicht mehr entschlüsseln.
Vor der Verwendung der Verschlüsselung muss die Option key in config/app.php gesetzt sein.
Sie wird aus der Umgebungsvariable APP_KEY gelesen.Erzeugen Sie einen sicheren Schlüssel mit dem Befehl php artisan key:generate.
Er nutzt PHPs sicheren Zufallszahlengenerator und erstellt kryptografisch starke Schlüssel.
php artisan key:generate
Bei der Installation von Laravel wird der Schlüssel in der Regel automatisch erzeugt und in der .env-Datei gespeichert.
Wenn Sie den Verschlüsselungsschlüssel ändern, werden alle authentifizierten Nutzersitzungen abgemeldet.
Grund ist, dass Laravel alle Cookies – einschließlich Session-Cookies – verschlüsselt.Zudem lassen sich mit einem alten Schlüssel verschlüsselte Daten nicht mehr entschlüsseln.Um dieses Problem abzumildern, können Sie in APP_PREVIOUS_KEYS alte Schlüssel kommagetrennt hinterlegen.
Zum Verschlüsseln nutzt Laravel immer den aktuellen Schlüssel. Beim Entschlüsseln probiert es zunächst den aktuellen Schlüssel und, wenn dieser fehlschlägt, der Reihe nach die alten Schlüssel.
So können Nutzerinnen und Nutzer die Anwendung auch während der Rotation weiterverwenden.
Verschlüsseln Sie Werte mit der Methode encryptString der Facade Crypt.
Die Werte werden per OpenSSL und AES-256-CBC verschlüsselt und mit einem MAC signiert.
<?phpnamespace App\Http\Controllers;use Illuminate\Http\RedirectResponse;use Illuminate\Http\Request;use Illuminate\Support\Facades\Crypt;class DigitalOceanTokenController extends Controller{ /** * Den API-Token des Nutzers speichern. */ public function store(Request $request): RedirectResponse { $request->user()->fill([ 'token' => Crypt::encryptString($request->token), ])->save(); return redirect('/secrets'); }}
encryptString verschlüsselt Strings ohne vorherige Serialisierung. Möchten Sie Objekte oder Arrays verschlüsseln, verwenden Sie encrypt.
Methode
Verwendung
Crypt::encryptString($value)
Verschlüsselt einen String direkt
Crypt::encrypt($value)
Serialisiert den Wert und verschlüsselt ihn (auch Arrays und Objekte)
Entschlüsseln Sie Werte mit der Methode decryptString der Facade Crypt.
Kann der Wert nicht korrekt entschlüsselt werden – etwa wegen eines ungültigen MAC –, wird eine DecryptException ausgelöst.
use Illuminate\Contracts\Encryption\DecryptException;use Illuminate\Support\Facades\Crypt;try { $decrypted = Crypt::decryptString($encryptedValue);} catch (DecryptException $e) { // Verhalten bei fehlgeschlagener Entschlüsselung abort(400, 'Ungültige Daten.');}
Methode
Verwendung
Crypt::decryptString($value)
Als String entschlüsseln
Crypt::decrypt($value)
Entschlüsseln und deserialisieren (auch Arrays und Objekte)
Ist der Cast gesetzt, werden Werte beim Setzen und Auslesen automatisch verschlüsselt bzw. entschlüsselt.
// Wird automatisch verschlüsselt in die Datenbank geschrieben$user->secret_note = 'Geheime Notiz';$user->save();// Wird automatisch entschlüsselt zurückgegebenecho $user->secret_note; // 'Geheime Notiz'
Die encrypted:*-Casts nutzen intern Crypt::encrypt und Crypt::decrypt.
Als Datenbankspaltentyp empfehlen sich text oder longText.
Schema::create('profiles', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained(); $table->text('my_number')->nullable(); // Verschlüsselter Wert als text $table->text('bank_account')->nullable(); $table->timestamps();});