05 août 2025·8 min de lecture

Chiffrement au niveau des champs : quoi chiffrer, gestion des clés et migrations

Le chiffrement au niveau des champs protège les données sensibles tout en gardant l'application utilisable. Apprenez quoi chiffrer, comment gérer les clés et comment migrer en toute sécurité.

Chiffrement au niveau des champs : quoi chiffrer, gestion des clés et migrations

Quel problème le chiffrement au niveau des champs résout-il réellement ?

Si quelqu'un obtient une copie de votre base de données, il peut lire tout ce qui est stocké en clair. Cela peut arriver via une sauvegarde mal configurée, un ordinateur volé avec un dump, un outil d'administration exposé ou un bug qui fuit des données. Dans ces cas, le dommage n'est pas seulement « nous avons été piratés », c'est « chaque enregistrement utilisateur est lisible ».

Le chiffrement au niveau des champs réduit le rayon d'impact. Plutôt que de compter uniquement sur la protection du disque ou du réseau, vous protégez des valeurs spécifiques dans la base pour qu'elles soient illisibles sans la bonne clé. Si un attaquant récupère des lignes, les champs chiffrés ressemblent à du bruit.

Il aide à séparer les couches :

  • TLS protège les données en transit entre votre app et la base.
  • Le chiffrement complet du disque protège le support quand il est hors ligne.
  • Le chiffrement au niveau des champs protège des colonnes spécifiques même si le contenu de la base est copié.

Le compromis est réel : une fois qu'un champ est chiffré, la base ne peut plus facilement chercher, trier ou grouper dessus. Rapports, filtres et fonctions "trouver l'utilisateur par X" peuvent nécessiter des changements. Beaucoup d'équipes conservent une valeur de recherche limitée (par exemple un hash signé de l'email) pour préserver les requêtes courantes sans stocker la valeur en clair.

Le chiffrement au niveau des champs vise généralement quelques objectifs concrets : limiter ce qu'un dump divulgue, respecter les attentes de confidentialité, réduire les dommages en aval (vol d'identité, arnaques ciblées), et diminuer le risque d'accès interne, surtout dans des bases de code partagées ou désordonnées.

Décider quoi chiffrer (et quoi laisser)

Le chiffrement au niveau des champs vaut l'effort uniquement pour les données qui causeraient un vrai dommage si elles étaient exposées. Une définition simple de « sensible » : si quelqu'un obtient une copie de votre base, qu'est-ce qui lui permettrait de voler de l'argent, prendre le contrôle de comptes, faire chanter des utilisateurs ou rompre des promesses de confidentialité ?

Commencez par lister les quelques champs vraiment dangereux en clair. Exemples courants : identifiants gouvernementaux (SSN), date de naissance, tokens d'API, codes de réinitialisation, notes privées, et tout ce qui permettrait à un attaquant d'agir comme un utilisateur ou d'accéder à un service tiers.

Beaucoup de champs n'ont généralement pas besoin d'être chiffrés parce qu'ils sont nécessaires au fonctionnement et ont un faible impact seuls : IDs internes et clés étrangères, timestamps (created_at, last_login), booléens et flags d'état, champs de profil publics (display name, bio), et métadonnées non sensibles utilisées pour le tri et le filtrage.

Ensuite, décidez qui doit lire le texte en clair. Certains champs ne doivent être lisibles que par votre application à l'exécution (par exemple un token d'API pour appeler un fournisseur). D'autres peuvent nécessiter un accès strictement contrôlé par le support (pattern « voir les 4 derniers chiffres »). Et certains devraient n'être lisibles que par l'utilisateur, ce qui implique souvent de chiffrer au repos et de limiter les endroits où la décryption peut avoir lieu.

Engagez-vous à commencer petit. Chiffrer « tout au cas où » casse la recherche, les rapports et les intégrations, et complique les migrations plus tard.

Choisir une approche adaptée aux besoins de votre app

Il n'existe pas une seule « meilleure » façon de faire du chiffrement au niveau des champs. Le bon choix dépend de ce que votre application doit encore faire des données protégées : recherches, exports, outils de support et audits.

Si vous n'avez besoin que de relire la valeur (par ex. afficher l'ID fiscal d'un utilisateur), utilisez un chiffrement aléatoire (non déterministe). C'est plus sûr car une même entrée ne produit pas le même ciphertext. L'inconvénient : vous ne pouvez pas faire de requêtes exactes sur la colonne chiffrée.

Si vous devez faire des recherches par égalité ("trouver l'utilisateur par SSN"), le chiffrement déterministe est séduisant car il permet l'égalité. Mais il révèle des motifs (même valeur = même ciphertext). Une option plus sûre dans beaucoup d'apps est de conserver la valeur chiffrée et de stocker un hash signé séparé pour les recherches.

Utilisez un chiffrement authentifié, pas « chiffrement seul ». Sans authentification, l'app peut ne pas détecter une altération. Avec un mode authentifié (souvent AEAD), l'app sait si le ciphertext a été modifié.

Pour la gestion des clés, l'envelope encryption est souvent un bon compromis pratique. Vous chiffrez le champ avec une data key (DEK), puis vous enveloppez (wrap) cette DEK avec une master key (KEK). Vous pouvez le faire par enregistrement ou par client/tenant. Des clés par tenant limitent le rayon d'impact dans les apps multi-tenant et simplifient le offboarding.

Quand vous n'avez pas besoin du texte en clair, ne chiffrez pas : hashez. Les mots de passe en sont l'exemple classique : stockez un hash de mot de passe lent, pas le mot de passe chiffré.

La tokenisation aide quand des parties du workflow ne supportent pas le ciphertext (outils legacy, dashboards de support, exports tiers). Vous remplacez la valeur sensible par un token et conservez la vraie valeur dans un store verrouillé séparé.

Un guide rapide :

  • Besoin d'afficher plus tard : chiffrement aléatoire + authentification.
  • Besoin de recherche par égalité : valeur chiffrée + index par hash signé (ou chiffrement déterministe avec précautions).
  • Besoin d'isolation par tenant : envelope encryption avec clés par tenant.
  • Jamais besoin du texte en clair : hashing.
  • Workflows cassent à cause du ciphertext : tokenisation.

Notions de base sur la gestion des clés, sans jargon

Le chiffrement au niveau des champs n'est sûr que si vos clés le sont. Le but est simple : votre app peut déchiffrer quand c'est vraiment nécessaire, mais les clés sont protégées ailleurs, avec des règles d'accès strictes et des traces d'audit.

Un modèle mental utile est « séparation des rôles ». Votre base stocke les ciphertexts. Votre app demande chiffrement/déchiffrement quand c'est autorisé. Un système de clés garde et contrôle l'utilisation des clés.

Où doivent vivre les clés

Pour la plupart des équipes, le choix le plus sûr par défaut est un service de clés géré, pas une solution maison. Options courantes : cloud KMS, service avec HSM, ou un gestionnaire de secrets qui fournit la bonne clé à l'exécution.

Évitez les échecs fréquents :

  • Ne stockez pas les clés dans la base de données.
  • Ne commettez pas les clés dans le repo.
  • Ne laissez pas les clés dans des fichiers d'environnement partagés lisibles par de nombreuses personnes/systèmes.
  • Ne réutilisez pas la même clé entre dev, staging et production.

Exemple d'accès pratique : si un outil de support peut voir des profils masqués, il ne devrait pas pouvoir déchiffrer les valeurs complètes. Seule l'API principale qui sert les utilisateurs authentifiés devrait avoir la permission de déchiffrer en production.

Accès et logs (pour prouver ce qui s'est passé)

L'accès aux clés doit être explicite et minimal. Définissez quels services peuvent déchiffrer quels champs, dans quels environnements, et sous quelle identité (compte service ou rôle). Si un job en arrière-plan n'a besoin que d'écrire chiffré, il n'a peut-être pas besoin du droit de déchiffrer.

Prévoyez des audits tôt. Vous voulez des logs d'utilisation des clés qui répondent à « qui a utilisé quelle clé, quand et d'où ». Cela rend les enquêtes possibles et aide à détecter des erreurs comme un service de test appelant des clés de production.

Rotation et versioning de clés dont vous aurez besoin plus tard

Le chiffrement au niveau des champs n'est pas « configurez une fois et oubliez ». Planifiez la rotation des clés dès le départ, sinon vous risquez de rester coincé avec des clés risquées qu'on ne peut pas changer sans downtime.

D'abord, décidez l'unité des clés. Une seule clé pour toute l'app est simple, mais agrandit l'impact d'un incident. Des clés par tenant limitent le rayon d'impact pour un SaaS. Des clés par utilisateur clarifient les règles d'accès, mais compliquent les partages. Des clés par enregistrement sont rares sauf cas très spécifiques.

Quel que soit votre choix, stockez un identifiant de clé avec chaque valeur chiffrée. Cela peut être une étiquette de version (v3) ou un key ID. L'important est que la décryption puisse regarder le ciphertext, voir la version et sélectionner la clé correcte sans deviner.

Une configuration de rotation pratique a généralement deux couches :

  • Une data-encryption key (DEK) utilisée pour chiffrer les champs.
  • Une master key (KEK) utilisée pour envelopper (wrap) la DEK.

Avec cela, vous pouvez faire tourner la master key sans réécrire toutes les données chiffrées : vous ré-enveloppez la DEK, ce qui est rapide.

Parfois il faut ré-encrypter les données elles-mêmes : si une DEK est exposée, si vous changez d'algorithme/paramètres, ou si la politique exige un périmètre différent (ex. passer d'une clé app-wide à des clés par tenant).

Ne négligez pas les backups et la récupération des clés. Perdre les clés, c'est perdre les données. Conservez des sauvegardes chiffrées des clés, restreignez l'accès et testez les restaurations régulièrement. Un échec courant : « on a sauvegardé la base, mais pas les clés ».

Exemple : une startup fait une rotation de v1 vers v2. Les nouvelles écritures utilisent v2, les anciennes lignes gardent v1, et un job de fond les ré-encrypte progressivement.

Comment ajouter le chiffrement au niveau des champs, étape par étape

Corriger l'auth et les permissions cassées
Si la connexion, les codes de récupération ou les rôles sont fragiles, nous les corrigerons avant vos changements de chiffrement.

Traitez cela comme un changement de modèle de données, pas un correctif de sécurité rapide. Un déploiement soigneux évite de fuiter du texte en clair dans les logs, exports ou scripts admin occasionnels.

Commencez par cartographier ce qui est vraiment sensible et où cela transite. Ne regardez pas seulement la base : tracez la création, la lecture, la mise à jour, les jobs en arrière-plan, l'analytics et les exports. Un oubli courant : chiffrer une colonne mais oublier le job CSV d'export, qui devient la nouvelle fuite.

Choisissez une librairie crypto éprouvée pour votre stack et un schéma de chiffrement que vous saurez expliquer à votre futur vous. Pour la plupart des apps, le chiffrement authentifié est le bon défaut. Gardez les clés hors de la base et prévoyez le versioning dès le jour 1.

Un déploiement qui fonctionne souvent :

  • Ajoutez de nouvelles colonnes chiffrées à côté des anciennes en clair et déployez la modification de schéma.
  • Ajoutez une petite couche qui fait encrypt-on-write et decrypt-on-read, et faites en sorte que le reste de l'app appelle uniquement cette couche.
  • Arrêtez d'écrire en clair dès que c'est sûr, mais conservez les lectures en clair brièvement pour la transition.
  • Backfillez les lignes existantes par lots, avec monitoring, limites de débit et plan de rollback.
  • Vérifiez avec des requêtes réelles et des exports, puis supprimez les champs en clair dans une migration ultérieure.

Pendant le backfill, évitez d'imprimer les valeurs déchiffrées dans les logs, rapports d'erreur ou dashboards admin. Logger les IDs d'enregistrement et des comptes rendus d'état à la place.

Conserver le fonctionnement des fonctionnalités : recherche, rapports et performance

Le chiffrement au niveau des champs protège des valeurs sensibles, mais peut casser des fonctionnalités si vous ne planifiez pas. Avant de chiffrer des colonnes, listez quels écrans et jobs en dépendent : boîtes de recherche, tables admin, exports et rapports planifiés.

Recherche et filtrage

Avec le chiffrement aléatoire, une même entrée s'encryptent différemment. Les recherches exactes et le dédoublonnage ne fonctionnent plus car la base ne peut comparer des ciphertexts. Si vous avez besoin d'une recherche exacte (trouver un utilisateur par SSN), stockez un token de recherche séparé à côté de la valeur chiffrée, comme un hash signé.

La recherche partielle (contains, starts-with) n'est généralement pas supportable en toute sécurité sur du texte chiffré sans systèmes spécialisés, donc la plupart des équipes la suppriment pour les champs sensibles.

Le tri et les requêtes par plage cassent aussi. Le ciphertext n'a pas d'ordre significatif : vous ne pouvez pas trier par "salaire" ou filtrer "date de naissance entre X et Y" directement. Une solution courante est de stocker un dérivé grossier (mois/année) ou des buckets pré-calculés.

Rapports, indexation, cache et performance

Pour l'analytics, prévoyez un dataset séparé : agrégats, compteurs ou une copie redacted qui exclut les champs sensibles.

Quelques règles pratiques :

  • Indexez des hashes ou des keyed hashes, pas les valeurs déchiffrées.
  • Ne mettez pas de données déchiffrées dans des caches partagés ou des logs.
  • Déchiffrez le plus tard possible (juste avant l'usage).
  • Mesurez les chemins chauds : déchiffrer en boucle peut ajouter de la latence.

Migrations sans exposer le texte en clair

Ajouter le chiffrement des champs en toute sécurité
FixMyMess peut implémenter un chiffrement AEAD au niveau des champs et des recherches sécurisées sans casser les requêtes principales.

Supposez que la base sera dans un état mixte un moment : certains rangs en clair, d'autres chiffrés, et quelques-uns avec différentes versions de clé. Votre code doit gérer ces cas sans qu'il faille lancer un script ponctuel qui imprime du clair dans des logs ou fichiers temporaires.

Un pattern courant est le dual-read : quand l'app charge une valeur, elle essaie d'abord le champ chiffré. S'il est vide, elle retombe sur le champ hérité en clair. Cela maintient les anciennes données pendant que vous migrez en arrière-plan.

Associez cela au dual-write : quand l'app sauvegarde une valeur, elle écrit la forme chiffrée et, pour une courte période, maintient aussi l'ancien champ en clair. Ainsi les nouveaux enregistrements ne sont pas créés en ancien format pendant que vous chiffrez l'existant.

Pour le backfill, lancez un job de fond qui chiffre les lignes héritées par petits lots. Traitez-le comme un système de production : limitez le débit, gérez les retries avec des écritures idempotentes, enregistrez la progression, attendez des échecs partiels et stockez la version de clé avec le ciphertext.

Exemple : une table signup a phone_plain et vous ajoutez phone_enc + phone_key_version. Les nouveaux inscrits écrivent phone_enc. Le job parcourt les anciens utilisateurs, chiffre phone_plain, définit la version et laisse le texte clair jusqu'à vérification des lectures, exports et outils support.

Ne supprimez le texte clair qu'après un cutoff clair : métriques montrant une couverture chiffrée proche de 100%, dual-read en production depuis suffisamment longtemps et un plan de rollback.

Erreurs courantes et pièges à éviter

Le chiffrement au niveau des champs est facile à démontrer sur le happy path. Les problèmes apparaissent ensuite : incidents, migrations, exports ou workflows de support.

Les pièges qui fuisent des données (même si vous chiffrez)

La plupart des fuites ne viennent pas de la base. Elles viennent de tout ce qui l'entoure : logs, exports, dashboards, endpoints de debug et outils tiers.

Échecs courants : texte clair dans les logs (prints de debug, dumps de requêtes, traces d'exception), clés hardcodées ou côté client (apps mobiles, bundles navigateur, secrets commis), absence de détection de falsification (pas de chiffrement authentifié), sorties oubliées (CSV, reçus par email, webhooks, écrans admin), et restaurations non testées (sauvegardes sans clés ou sans info de version).

Exemple concret : vous chiffrez les SSN, mais une erreur 500 logge le body complet pour aider le debug. La base est sûre, mais les logs deviennent une base d'ombre en clair.

Chiffrer de mauvais champs

Une erreur fréquente est de chiffrer des champs dont l'app dépend pour des jointures, des contraintes d'unicité ou des workflows de support. Chiffrer l'email peut casser la recherche de login, le dédoublonnage et la recherche client dans les outils admin. Si vous avez besoin de tests d'égalité, il faudra probablement une valeur dérivée (keyed hash) ou un design différent.

Avant de livrer, faites un rapide « où va cette valeur ? » : requêtes DB, logs, exports, emails, analytics et outils support.

Enfin, considérez la récupération des clés comme une fonctionnalité. Des données chiffrées sans clés récupérables, c'est une perte de données permanente.

Checklist rapide avant de déployer

Le chiffrement au niveau des champs échoue souvent pour des raisons banales : un champ est copié quelque part, ou un job écrit du texte clair "juste une fois". Avant la mise en production, revoyez les points de fuite possibles.

  • Cartographiez tous les endroits où la valeur sensible peut apparaître : colonnes DB, logs, events analytics, rapports d'erreur, caches, index de recherche et sauvegardes.
  • Confirmez que rien n'écrit du texte clair « temporairement » : pas de logs debug, pas d'exports de fichiers, pas de fichiers temporaires sur disque.
  • Stockez les infos de version avec le ciphertext : version de clé (et idéalement un tag d'algorithme/version) pour pouvoir déchiffrer les anciens enregistrements après changement.
  • Démontrez que vous pouvez faire tourner les clés sans downtime : lisez les anciennes données, écrivez les nouvelles avec la nouvelle clé, puis ré-encryptez en arrière-plan.
  • Appliquez le principe du moindre privilège pour la décryption : seules les services et rôles qui ont vraiment besoin du texte en clair doivent avoir cet accès.

Vérifiez que vous avez une procédure testée de backup et restore pour les données et les clés, et qu'elle fonctionne sous pression (nouvel environnement, nouvelle machine, nouvelle personne qui l'exécute).

Exemple : chiffrer quelques champs dans une vraie app

Se préparer pour la production
Nous rendrons votre app prête pour la production avec une configuration plus sûre, des contrôles de déploiement et des environnements propres.

Une petite startup garde les ID fiscaux clients et les notes internes de support dans une table customers. L'app a commencé en prototype et a la mauvaise habitude de logger l'enregistrement complet en cas d'erreur pour le debug. Cela signifie que les ID fiscaux et les notes privées peuvent finir dans les logs, dashboards ou outils d'erreur tiers.

Ils choisissent de chiffrer deux colonnes : tax_id et support_notes. Tout le reste reste en clair pour que l'app puisse filtrer, trier et produire des rapports sans travail additionnel.

Pour garder la réactivité du support, ils ajoutent une colonne tax_id_hash (un hash unidirectionnel signé). Le support peut faire des recherches exactes (un client appelle et lit son ID) sans que la base stocke l'ID en clair. L'app compare en hachant l'entrée et en recherchant le hash.

Plan de déploiement pour rester en service pendant la conversion :

  • Ajouter de nouvelles colonnes chiffrées (ou des versions _enc) et un champ key_version.
  • Dual-write : sauvegarder à la fois l'ancien champ en clair et la valeur chiffrée temporairement.
  • Dual-read : préférer la valeur chiffrée, retomber sur le clair si absent.
  • Backfill par lots avec alertes si la décryption échoue ou si un enregistrement semble malformé.
  • Quand la couverture est proche de 100 %, arrêter d'écrire le texte en clair, puis le supprimer dans une migration ultérieure.

Après le changement, les logs d'erreur contiennent des placeholders redacted au lieu de secrets complets. Le support ne voit les notes déchiffrées que si son rôle le permet.

Prochaines étapes si vous modernisez un code existant

Moderniser une app existante est l'endroit où le chiffrement au niveau des champs devient compliqué. L'objectif est d'avancer sans créer une longue fenêtre où les données sensibles sont exposées, copiées dans des logs ou réécrites en clair.

Commencez par un bref document de décision à partager : une page listant quels champs sont chiffrés, pourquoi (légal, risque, confiance client) et quels systèmes/roles peuvent déchiffrer. Cela évite des changements « chiffrer tout » qui cassent des fonctionnalités plus tard.

Lancez un petit pilote que vous maîtrisez : une table, un flow utilisateur, un chemin de migration. Chiffrez quelque chose comme SSN ou numéro de compte dans une table client, puis mettez à jour seulement les écrans "voir profil" et "modifier profil". Vous trouverez vite où le clair fuit (logs, exports, trackers d'erreurs) avant d'étendre à d'autres champs.

Ajoutez des garde-fous avant le déploiement :

  • Stoppez le logging de secrets (règle simple : ne loggez jamais les bodies de requête).
  • Rendre les erreurs sûres (pas de stack traces ou de valeurs déchiffrées dans les messages destinés aux utilisateurs).
  • Revoir les accès (qui peut lancer des exports, qui peut interroger la prod, ce qui part en analytics).
  • Ajouter des tests qui échouent si du texte clair est stocké ou renvoyé.

Si vous avez hérité d'un code généré par IA, faites une passe de sécurité ciblée avant de migrer : ces projets ont souvent des secrets exposés, des permissions trop larges et du logging « trop bavard ».

Si vous avez besoin d'aide extérieure pour nettoyer un code généré par IA avant d'ajouter le chiffrement, FixMyMess (fixmymess.ai) se concentre sur le diagnostic et la réparation de ce type de code, y compris le durcissement et les migrations sûres, afin que vous n'empiliez pas le chiffrement sur des fuites existantes.

Questions Fréquentes

De quoi le chiffrement au niveau des champs me protège-t-il réellement ?

Il protège des valeurs spécifiques dans vos tables pour qu'un dump de base de données copié ne révèle pas ces champs en clair. C'est principalement pour les scénarios « quelqu'un a récupéré les lignes », pas pour arrêter des attaques contre votre application en direct.

Quels champs devrais-je chiffrer en premier ?

Commencez par les champs dont l'exposition causerait un vrai préjudice : identifiants gouvernementaux, date de naissance, codes de récupération, tokens d'API ou notes privées. Laissez les métadonnées courantes (IDs, timestamps, flags) en clair pour que l'application puisse continuer à interroger et produire des rapports normalement.

Dois-je utiliser un chiffrement aléatoire (non déterministe) ou déterministe ?

Le chiffrement aléatoire (non déterministe) est le choix sûr par défaut quand vous avez juste besoin de relire la valeur plus tard : une même entrée ne produit pas le même ciphertext à chaque fois. Le coût : vous ne pouvez généralement pas faire de recherche par égalité sur la colonne chiffrée.

Comment trouver un utilisateur par une valeur sensible si elle est chiffrée ?

Conservez la valeur sensible chiffrée, et ajoutez une valeur de recherche séparée comme un hash signé (keyed hash) pour les recherches par égalité. Ainsi vous cherchez des correspondances sans stocker l'original en texte clair consultable.

Ai-je besoin d'un chiffrement authentifié, ou le chiffrement seul suffit-il ?

Utilisez l'authenticated encryption (souvent appelé AEAD) afin que l'application détecte si le ciphertext a été modifié. Les approches « chiffrement seul » peuvent laisser passer des données altérées et provoquer des bugs ou des problèmes de sécurité lors du déchiffrement.

Où doivent vivre les clés de chiffrement ?

Gardez les clés en dehors de la base et du dépôt, et préférez un service de clés géré (cloud KMS, HSM ou gestionnaire de secrets) pour contrôler les accès. Un bon défaut : seul le service de production principal qui a vraiment besoin du texte en clair doit pouvoir déchiffrer.

Comment gérer la rotation des clés sans temps d'arrêt ?

Stockez un identifiant de clé (une version ou un key ID) avec chaque valeur chiffrée pour pouvoir déchiffrer les données anciennes après une rotation. L'envelope encryption permet souvent de faire tourner la clé maître sans réécrire toutes les données chiffrées.

Quelle est la façon la plus sûre de migrer des données en clair vers des champs chiffrés ?

Traitez la migration comme un changement de modèle de données : ajoutez de nouvelles colonnes chiffrées, passez à l'écriture chiffrée, et backfillez les anciennes lignes par lots. Pendant la transition, préférez la lecture chiffrée et retombez sur le texte clair uniquement si nécessaire, puis supprimez le texte clair une fois que tout est vérifié.

Quelles sont les façons les plus courantes de fuir du texte en clair même après chiffrement ?

Les fuites surviennent souvent hors de la base : arrêtez d'écrire du texte clair dans les logs, rapports d'erreur, exports, écrans admins et événements analytics. Évitez aussi les impressions de debug temporaires pendant les backfills, car elles peuvent créer une base d'ombre contenant les données sensibles.

Que faire si mon code est en désordre (ou généré par une IA) et que je crains que le chiffrement casse des choses ?

Si vous héritez d'une base générée par IA ou d'un code en désordre, corrigez le logging de secrets et les contrôles d'accès avant d'ajouter le chiffrement, car le chiffrement n'aidera pas si le texte en clair circule déjà dans les logs et exports. FixMyMess (fixmymess.ai) peut réaliser un audit gratuit du code puis réparer et durcir l'app pour que le chiffrement ne soit pas posé sur des fuites existantes, la plupart des corrections étant réalisées en 48–72 heures.