Passer au contenu principal

Qu’est-ce que la façade Crypt

Le service de chiffrement de Laravel utilise OpenSSL avec AES-256-CBC (ou AES-128-CBC) et propose une interface simple pour chiffrer et déchiffrer des valeurs. Toutes les valeurs chiffrées par Laravel sont signées par un Message Authentication Code (MAC). Le déchiffrement échoue donc si la valeur a été altérée.

Configuration

Génération d’APP_KEY

Avant d’utiliser le chiffrement, la clé key de config/app.php doit être définie. Sa valeur provient de la variable d’environnement APP_KEY. Générez une clé sûre avec php artisan key:generate. Une clé cryptographiquement sûre est produite via le générateur d’aléa sécurisé de PHP.
php artisan key:generate
À l’installation de Laravel, la clé est généralement générée automatiquement et stockée dans .env.
APP_KEY=base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY=
Ne divulguez jamais APP_KEY. Si elle fuit, toutes vos données chiffrées peuvent être déchiffrées.

Rotation de la clé de chiffrement

Changer la clé déconnecte toutes les sessions utilisateur authentifiées, car Laravel chiffre l’ensemble des cookies, y compris ceux de session. De plus, les données chiffrées avec l’ancienne clé ne peuvent plus être déchiffrées. Pour atténuer cela, listez les anciennes clés séparées par une virgule dans APP_PREVIOUS_KEYS.
APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="
APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2ax3EF2Lyq/hH6QghBGLIq5uL+Gp8/w="
Laravel chiffre toujours avec la clé actuelle mais, lors du déchiffrement, essaie les anciennes clés en cas d’échec. Cela permet une rotation sans interruption pour les utilisateurs.

Chiffrement

Utilisez encryptString de la façade Crypt pour chiffrer une valeur. La valeur chiffrée est produite avec OpenSSL et AES-256-CBC, et signée par MAC.
<?php

namespace App\Http\Controllers;

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

class DigitalOceanTokenController extends Controller
{
    /**
     * Stocke le token API de l'utilisateur.
     */
    public function store(Request $request): RedirectResponse
    {
        $request->user()->fill([
            'token' => Crypt::encryptString($request->token),
        ])->save();

        return redirect('/secrets');
    }
}
encryptString chiffre la chaîne sans sérialisation. Pour chiffrer un objet ou un tableau, utilisez encrypt.
MéthodeUsage
Crypt::encryptString($value)Chiffre une chaîne telle quelle
Crypt::encrypt($value)Sérialise puis chiffre (tableaux, objets)

Déchiffrement

Utilisez decryptString pour déchiffrer une valeur. Si le MAC est invalide (ou en cas d’échec), une DecryptException est levée.
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;

try {
    $decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
    // Traitement en cas d'échec
    abort(400, 'Données invalides.');
}
MéthodeUsage
Crypt::decryptString($value)Déchiffre en chaîne
Crypt::decrypt($value)Déchiffre et désérialise (tableaux, objets)

Cast de modèle

Sur un modèle Eloquent, le cast encrypted automatise le chiffrement/déchiffrement d’un attribut.
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected function casts(): array
    {
        return [
            'secret_note'    => 'encrypted',           // Chiffrement d'une chaîne
            'profile_data'   => 'encrypted:array',     // Tableau chiffré
            'preferences'    => 'encrypted:collection',// Collection chiffrée
            'metadata'       => 'encrypted:object',    // Objet chiffré
            'settings'       => 'encrypted:json',      // JSON chiffré
        ];
    }
}
Avec ce cast, les valeurs sont automatiquement chiffrées/déchiffrées à l’assignation et à la lecture.
// Chiffré automatiquement avant enregistrement
$user->secret_note = 'Note secrète';
$user->save();

// Déchiffré automatiquement à la lecture
echo $user->secret_note; // 'Note secrète'
Les casts encrypted:* utilisent en interne Crypt::encrypt et Crypt::decrypt. Utilisez le type de colonne text ou longText en base.

Exemple : stockage chiffré d’informations personnelles

Modèle typique de stockage sécurisé d’informations personnelles (numéro national, numéro de carte…).

Migration

Schema::create('profiles', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained();
    $table->text('my_number')->nullable();     // Chiffré stocké en text
    $table->text('bank_account')->nullable();
    $table->timestamps();
});

Modèle

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    protected $fillable = ['user_id', 'my_number', 'bank_account'];

    protected function casts(): array
    {
        return [
            'my_number'    => 'encrypted',
            'bank_account' => 'encrypted',
        ];
    }
}

Contrôleur

use App\Models\Profile;
use Illuminate\Http\Request;

class ProfileController extends Controller
{
    public function store(Request $request)
    {
        $request->validate([
            'my_number'    => ['required', 'string'],
            'bank_account' => ['required', 'string'],
        ]);

        // Le modèle chiffre automatiquement lors de la sauvegarde
        Profile::create([
            'user_id'      => $request->user()->id,
            'my_number'    => $request->my_number,
            'bank_account' => $request->bank_account,
        ]);

        return redirect('/profile');
    }

    public function show(Request $request)
    {
        $profile = $request->user()->profile;

        // Le modèle déchiffre automatiquement à la lecture
        return view('profile.show', ['profile' => $profile]);
    }
}

Récapitulatif

ObjectifMéthode
Générer APP_KEYphp artisan key:generate
Chiffrer une chaîneCrypt::encryptString($value)
Déchiffrer une chaîneCrypt::decryptString($value)
Chiffrer un tableau/objetCrypt::encrypt($value)
Cast automatique d’un attribut'column' => 'encrypted'
Rotation de cléAjouter l’ancienne à APP_PREVIOUS_KEYS

Prochaines étapes

Hachage

Apprenez à hacher et vérifier les mots de passe en toute sécurité.

Autorisation

Contrôlez l’accès à l’aide des policies et des gates.
Dernière modification le 13 juillet 2026