Développement d’applications4 min de lecture

Pourquoi nous avons préféré le chiffrement d’enveloppe à SQLCipher pour une app bancaire

SQLCipher est le choix par défaut pour chiffrer les données locales sur Android. Pourquoi nous avons opté pour le chiffrement d’enveloppe, et à quel prix.

Lorsqu’une app mobile stocke des données sensibles en local, le conseil par défaut sur Android est presque automatique : utilisez SQLCipher. C’est une solution mature, bien connue, qui chiffre toute la base de données.

Lors d’un audit de sécurité et d’une remédiation pour l’app Android d’une banque de détail, nous avons choisi une autre approche : le chiffrement d’enveloppe des valeurs sensibles elles-mêmes, avec des clés conservées dans l’Android Keystore. Dans cet article, nous présentons les deux options, nous expliquons pourquoi le chiffrement d’enveloppe convenait à cette app et ce à quoi nous avons renoncé pour y parvenir.


Le problème : les données sensibles stockées sur l’appareil

Les apps bancaires mettent des données en cache pour rester rapides et utilisables hors ligne : informations de compte, transactions récentes, données de profil. Si ces données restent en clair sur l’appareil, un téléphone rooté, une sauvegarde ou une copie forensique peut les exposer. Dans l’OWASP Mobile Top 10 (2024), cela relève de M9 : Insecure Data Storage (stockage de données non sécurisé) et de M10 : Insufficient Cryptography (cryptographie insuffisante).


Option 1 : SQLCipher

SQLCipher est un fork de SQLite qui chiffre l’intégralité du fichier de base de données.

  • Atout : tout est chiffré, index et métadonnées compris.

  • Atout : les données chiffrées restent entièrement interrogeables.

  • Coût : des bibliothèques natives pour chaque architecture de processeur, qui alourdissent l’app.

  • Coût : la clé de la base doit malgré tout être protégée, généralement par le Keystore de toute façon.

Option 2 : le chiffrement d’enveloppe

Le chiffrement d’enveloppe fonctionne avec deux niveaux de clés :

  1. Une clé de chiffrement des données (DEK) chiffre les valeurs sensibles avec un algorithme de chiffrement authentifié comme AES-GCM.

  2. Une clé de chiffrement de clés (KEK) conservée dans l’Android Keystore encapsule la DEK. Le code de l’app ne voit jamais la KEK, et sur les appareils compatibles, elle est adossée au matériel.

📌 À retenir :

Dans les deux approches, la véritable protection vient du Keystore. Le choix porte sur ce que vous chiffrez avec : le fichier entier, ou seulement les valeurs qui comptent.


Pourquoi le chiffrement d’enveloppe convenait à cette app

1. La plupart des données stockées n’étaient pas sensibles

Une grande partie de la base locale contenait de la configuration d’interface et d’autres données non sensibles. Chiffrer précisément les valeurs sensibles protégeait l’essentiel sans changer le fonctionnement du reste de la base.

2. La taille de l’app comptait

Se passer de SQLCipher a permis d’économiser environ 6,5 Mo de code natif. Pour une app bancaire que de nombreux utilisateurs installent sur des téléphones milieu de gamme via les données mobiles, la différence est réelle.

3. Le coût en performance était mesurable et faible

Nous avons mesuré le surcoût du déchiffrement des valeurs affichées par chaque écran : environ 1 ms par écran — bien en dessous de tout ce qu’un utilisateur pourrait percevoir.

4. Un seul modèle de clés pour tout

Le même modèle de clés adossé au Keystore peut protéger les valeurs dans la base de données, dans les préférences et dans les fichiers, au lieu d’un mécanisme distinct pour chacun.


Les compromis que nous avons acceptés

  • Pas de requêtes sur les champs chiffrés. Les valeurs sensibles ne peuvent être ni recherchées, ni triées, ni indexées : les requêtes ont dû être conçues autour des champs non sensibles.

  • La classification devient une tâche de conception. Quelqu’un doit décider, et documenter, quelles valeurs sont sensibles. En cas d’erreur, des données restent en clair.

  • Les métadonnées ne sont pas chiffrées. La structure des tables et les colonnes non sensibles restent lisibles.


Comparatif : SQLCipher ou chiffrement d’enveloppe

Critère SQLCipher Chiffrement d’enveloppe
Ce qui est chiffré Tout le fichier de base de données Une sélection de valeurs sensibles
Requêtes sur les données chiffrées Oui Non
Impact sur la taille de l’app Bibliothèques natives ajoutées Environ 6,5 Mo de moins dans cette app
Coût à l’exécution Chiffrement de chaque page de la base Environ 1 ms par écran (mesuré)
Effort de conception Faible Classification des données nécessaire
Idéal pour Des données majoritairement sensibles et interrogeables Quelques valeurs sensibles dans un jeu de données plus large

Comment Mobian aborde ces décisions

Chez Mobian, chaque modification de sécurité de cet audit s’accompagnait d’une courte note de décision écrite : le risque, les options, ce que nous avons choisi et ce que nous avons écarté. C’est cette trace qui permet à l’équipe sécurité d’une banque — ou à son auditeur — de comprendre pourquoi l’app fonctionne comme elle le fait. Nous choisirions tout aussi volontiers SQLCipher pour une app dont la plupart des données locales sont sensibles.

Conclusion

SQLCipher et le chiffrement d’enveloppe s’appuient tous deux sur l’Android Keystore pour assurer une protection réelle. Pour une app dont seule une partie des données locales est sensible, chiffrer directement ces valeurs a permis d’économiser 6,5 Mo pour un coût d’environ 1 ms par écran — en contrepartie d’une classification rigoureuse des données et de l’absence de requêtes sur les champs chiffrés. La bonne réponse dépend de vos données, et la décision mérite d’être consignée par écrit.

Questions fréquentes

Qu’est-ce que le chiffrement d’enveloppe ?

Le chiffrement d’enveloppe repose sur deux niveaux de clés. Les données sont chiffrées avec une clé de chiffrement des données (DEK), et la DEK est elle-même chiffrée, ou encapsulée, par une clé de chiffrement de clés (KEK). Sur Android, la KEK peut résider dans l’Android Keystore, où elle n’est jamais exposée au code de l’app.

SQLCipher est-il un mauvais choix ?

Non. SQLCipher est mature et chiffre l’intégralité du fichier de base de données, index et métadonnées compris. Il convient bien lorsque la majeure partie de la base est sensible ou lorsque les données chiffrées doivent rester interrogeables. Il ajoute en revanche des bibliothèques natives à l’app et modifie le fonctionnement de la couche base de données.

Qu’a permis d’économiser le chiffrement d’enveloppe dans ce projet ?

Se passer de SQLCipher a permis d’économiser environ 6,5 Mo de code natif dans l’app, pour un coût mesuré d’environ 1 ms par écran pour chiffrer et déchiffrer les valeurs sensibles affichées.

Quel est le principal inconvénient du chiffrement d’enveloppe au niveau des champs ?

La base de données ne peut ni rechercher, ni trier, ni indexer les champs chiffrés. Il faut donc décider avec soin quelles valeurs sont sensibles et concevoir les requêtes autour des champs non sensibles. Le chiffrement de la base entière évite ce travail de conception.

Le chiffrement d’enveloppe répond-il aux exigences de l’OWASP ?

Correctement mis en œuvre, avec des clés adossées au matériel lorsque c’est possible et un chiffrement authentifié comme AES-GCM, il répond aux catégories stockage de données non sécurisé et cryptographie insuffisante de l’OWASP Mobile Top 10 (2024). Savoir s’il satisfait un audit donné dépend des exigences de cet audit.

Estimation gratuite · sans engagement

Vous prévoyez un projet sur cette stack ?

Nous avons travaillé avec les outils dont nous parlons. Présentez-nous votre projet et obtenez un deuxième avis d’ingénieurs qui les ont mis en production.

  • 1Nous passons en revue votre produit, votre stack et votre roadmap
  • 2Nous vous signalons les risques déjà rencontrés sur des projets similaires
  • 3Vous recevez une proposition d’équipe et un calendrier indicatif sous 48 heures

Parlez-nous de votre projet

Vous préférez d’abord en parler ? Réservez un appel de 30 minutes