Ce qui se passe
Le composant KeyManagement, nouveau dans Symfony 8.2, contient un pont Doctrine
DBAL dont le type EncryptedType chiffre n'importe quelle colonne, par chiffrement
par enveloppe. Le piège tenait à la mise en place : il fallait un type Doctrine distinct
pour chaque combinaison de clé et de type de valeur, enregistré avant la première
requête. Symfony 8.2 écrit cette plomberie à votre place, de deux façons.
Comment ça marche
Avec l'ORM : l'attribut #[Encrypted]. On le pose sur une propriété mappée, sans
déclarer de type personnalisé. Doctrine traite la propriété comme d'habitude (un
téléphone reste une chaîne, une date de naissance une date). Avant l'écriture, Symfony
chiffre la valeur et la range en binaire ; à la lecture, il la déchiffre, et votre code
retrouve une string ou un DateTimeImmutable.
L'argument key désigne la clé maîtresse de votre KMS. Si vous stockez les clés de
données en base (option key_management.store), c'est un nom qui regroupe les valeurs
chiffrées avec la même clé de données.
À la compilation du conteneur, Symfony cherche les attributs dans les entités, aux
endroits où il cherche déjà vos services (src/Entity/ dans la configuration par
défaut), et crée les types nécessaires.
Sans l'ORM, ou hors des répertoires scannés : l'option doctrine_dbal.types. Elle
déclare les types chiffrés, enregistrés au démarrage du noyau. Ils utilisent
l'encrypteur à enveloppe adossé au store si key_management.store est configuré, sinon
celui du client par défaut. Une colonne marquée #[Encrypted] réutilise le type déclaré
ici pour la même clé et le même type de valeur.
La syntaxe exacte de l'attribut n'est pas reproduite ici : le billet l'illustre par du code, à consulter avec la documentation de Symfony 8.2.
Ce que ça change, et ce qui manque
- Chiffrer un téléphone ou une date de naissance tient en une ligne par propriété.
- Une entité située hors des répertoires de services, ou mappée en XML, n'est pas
trouvée : Symfony affiche une erreur claire, et il faut passer par
doctrine_dbal.types. - Lecture personnelle, hors de la source : la valeur étant du binaire chiffré, filtrer ou trier dessus en SQL n'a plus de sens, et une colonne existante en clair demandera une migration. Le billet n'aborde ni l'un ni l'autre.
- Le changelog de la semaine (A Week of Symfony #1033) mentionne des ponts vers AWS KMS, Azure Key Vault, Google Cloud KMS et HashiCorp Vault, et un nouveau pour Scaleway Key Manager.
- La 8.2 est en préparation (la maintenance de la semaine est la 8.1.9) : à essayer sur une entité de test, pas à déployer.
Source : New in Symfony 8.2: Encrypted Doctrine Columns, blog Symfony, 15 octobre 2026. Source en anglais. Voir aussi A Week of Symfony #1033.