Sécurité et flux de données
Où résident vos données, ce qui est chiffré, comment la connexion IA est authentifiée et limitée, ce qu'Assetli journalise, ce que voit le fournisseur d'IA et ce que nous ne savons pas encore faire.
Dernière mise à jour: 17 septembre 2026
Cette page s’adresse à un lecteur technique et sceptique. Chaque affirmation ci-dessous a été vérifiée dans le code de l’application à la date indiquée plus haut. Ce qui relève d’une limite et non d’une fonctionnalité figure au chapitre Ce que nous ne savons pas encore faire, signalé comme prévu.
En résumé
- Assetli ne se connecte jamais à votre banque et ne conserve aucun identifiant bancaire. Les données arrivent par import de fichier, saisie manuelle ou synchronisation facultative depuis Wallet by BudgetBakers à l’aide du jeton de cette application.
- La connexion IA repose sur OAuth 2.1 avec PKCE, un écran de consentement, des jetons de courte durée stockés sous forme d’empreinte, un profil par connecteur et des autorisations distinctes pour la lecture et l’écriture. L’écriture exige un forfait payant.
- Votre conversation avec l’IA n’atteint pas Assetli. Le serveur ne reçoit que les appels d’outils. Les lectures ne sont pas journalisées, les écritures le sont pendant douze mois.
- Aucune bibliothèque tierce de suivi d’erreurs ou d’analytique ne tourne sur l’API. L’analytique du navigateur sur le site public est soumise au consentement et ne voit jamais le trafic de l’API.
Où résident les données
| Quoi | Où |
|---|---|
| Application et API | Vercel, région de Francfort (fra1) |
| Base de données | MongoDB Atlas |
| Fichiers téléversés (relevés, photos, documents) | Stockage objet : Vercel Blob ou Cloudflare R2, selon la configuration du déploiement |
| Données de référence publiques (grilles tarifaires, statistiques) | Cloudflare R2 |
| Sauvegarde quotidienne de la base | Archive mongodump chiffrée en AES-256 avant de quitter le serveur de build, conservée 30 jours comme artefact GitHub Actions |
| Taux de change | Récupérés auprès de frankfurter.app (taux BCE). La requête ne contient que des codes de devises |
| Paiements | Stripe. Les données de carte n’atteignent jamais Assetli |
Connexion à Assetli
- Par e-mail et mot de passe. Les mots de passe sont stockés sous forme d’empreinte bcrypt.
- Connexion via Google ou Facebook (OAuth).
- Authentification à deux facteurs facultative par application TOTP avec codes de secours. Le secret TOTP est chiffré.
- Le compte est verrouillé après des tentatives de connexion répétées et infructueuses.
- La session repose sur un cookie HTTP-only émis par la bibliothèque Auth.js.
Chiffrement
- Tout le trafic passe par HTTPS.
- Un chiffrement au niveau des champs en AES-256-GCM (texte chiffré versionné, vecteur d’initialisation aléatoire, balise d’authentification) protège : le numéro de compte, l’IBAN et les notes des comptes bancaires, le jeton Wallet by BudgetBakers, les secrets à deux facteurs, vos propres clés d’API de fournisseurs d’IA et les notes Family Legacy. Les champs chiffrés ne peuvent pas être filtrés par une requête en base et ne sont déchiffrés qu’à l’affichage de l’enregistrement.
- Les jetons d’accès et de rafraîchissement OAuth, les codes d’autorisation et les clés d’API sont stockés sous forme d’empreinte SHA-256. La forme lisible n’existe que dans votre client.
La connexion IA, étape par étape
Voici ce qui se passe lorsque vous posez à Claude ou ChatGPT une question qui nécessite vos données.
- Votre client appelle
POST /api/mcpavec un corps JSON-RPC, c’est-à-dire le nom de l’outil et ses arguments. Rien d’autre de la conversation n’est envoyé. - Le middleware laisse passer la requête. Ce chemin n’a pas de mot de passe global et le corps de la requête n’est pas journalisé.
- Vérification du jeton. Le jeton de l’en-tête
Authorization: Bearerest haché puis recherché en base. Il doit exister, ne pas être expiré (1 heure), ne pas être révoqué, et son destinataire doit correspondre à l’hôte. L’enregistrement fournit votre identifiant d’utilisateur, le profil choisi au consentement, les autorisations et l’identifiant du client. - Autorisation, forfait et jeton d’aperçu. Un outil d’écriture exige l’autorisation
writeet un forfait Premium ou Max. Si l’un des deux manque, l’appel renvoie une erreur et rien ne s’exécute. Si les deux manquent, les outils d’écriture ne sont même pas proposés au client. Une écriture doit en outre porter un jeton de confirmation émis par son outil d’aperçu pour les mêmes arguments au cours des dix dernières minutes ; sans lui, ou avec des arguments différents, l’écriture est refusée. - Exécution de l’outil. Le traitement interroge MongoDB avec un filtre sur votre utilisateur et votre profil. Les résultats sont assemblés dans un ensemble de champs fixe.
- Audit (écritures uniquement). Le nom de l’outil, l’identifiant du client, le résultat et un résumé des arguments sont enregistrés dans la collection
mcp_audit_logsavec une expiration à 365 jours. Les montants, catégories, symboles, dates et noms de cibles sont conservés ; le texte libre (descriptions, notes, nom du commerçant, contenu du relevé) n’est stocké que sous forme de longueur, le contenu du relevé également sous forme d’empreinte. L’enregistrement lui-même porte son origine (createdVia: MCP et identifiant du connecteur), et chaque liste où il apparaît (transactions, ordres, relevés, objets de valeur, budgets) le signale par un badge « IA » dont l’infobulle indique le canal et l’outil. - Réponse. Le résultat en JSON revient à votre client, qui le transmet au modèle.
Ce qu’Assetli voit et ne voit pas
| Assetli le voit-il ? | |
|---|---|
| Votre question et les réponses du modèle | Non. Elles restent dans le client IA. |
| Nom de l’outil et arguments | Oui, le temps du traitement de la requête. |
| Arguments des appels d’écriture | Oui, sous forme de résumé sans texte libre, douze mois dans le journal d’audit. |
| Arguments des appels de lecture | Ne sont pas conservés. |
| Résultats des outils | Calculés et renvoyés, non conservés. |
| Identité du client | Le nom enregistré du connecteur et son identifiant. Dans les journaux d’hébergement habituels, également l’adresse IP et l’agent du serveur du client IA. |
La phrase « nous ne voyons que ce que vous voyez en cliquant dans l’application » est exacte pour la lecture. Pour l’écriture, Assetli conserve un peu plus qu’un clic dans l’application, à savoir l’enregistrement d’audit.
Ce que voit le fournisseur d’IA
Le fournisseur qui exécute votre modèle (Anthropic pour Claude, OpenAI pour ChatGPT, Google pour Gemini) voit vos questions, les résultats des outils et donc chaque chiffre qu’un outil renvoie. Ces données sont traitées selon les conditions de ce fournisseur, pas selon celles d’Assetli. Les outils renvoient les mêmes données que celles affichées dans l’application : soldes, transactions avec description et commerçant, positions, valeurs et adresses de biens immobiliers, plaques d’immatriculation, dettes. Ils ne renvoient jamais de numéros de compte, d’IBAN, de mots de passe, de jetons ni de données d’autres utilisateurs.
L’assistant intégré à l’application fonctionne autrement : c’est Assetli qui envoie vos messages et un instantané financier à Anthropic (ou au fournisseur dont vous avez saisi la clé) et qui conserve la conversation dans votre profil.
Portée du jeton
- Un utilisateur, un profil. Le jeton porte le profil choisi au consentement. Un connecteur ne peut pas changer de profil.
- Lecture ou écriture. Accordée sur l’écran de consentement, l’écriture inclut la lecture. Le serveur vérifie l’autorisation à chaque appel.
- Lié au destinataire. Un jeton émis pour
assetli.appest refusé par tout autre hôte. - De courte durée. Jeton d’accès 1 heure, jeton de rafraîchissement 60 jours, remplacé à chaque renouvellement.
- Révocable. Menu du compte → Connexion IA (MCP) liste chaque connecteur et révoque tous ses jetons d’un coup.
- Aucun secret partagé. Les clients sont des clients OAuth publics avec PKCE, il n’existe aucun secret client et votre mot de passe ne quitte jamais Assetli.
- Uniquement l’endpoint MCP. Le jeton d’un connecteur tiers est accepté par
/api/mcpet nulle part ailleurs. L’API REST n’accepte les jetons Bearer que de notre propre application mobile.
Journalisation
| Journal | Contenu | Conservation |
|---|---|---|
| Journal d’audit MCP (base) | Utilisateur, profil, identifiant du client, nom de l’outil, succès ou erreur, résumé des arguments sans texte libre. Écritures uniquement. Consultable dans le menu du compte → Connexion IA (MCP). | 365 jours |
| Journal des requêtes d’hébergement (Vercel) | Méthode, chemin, statut, durée, IP du client. Sans corps de requête. | Selon le forfait Vercel |
| Sortie des fonctions (Vercel) | Messages d’erreur émis par l’application en cas d’échec, par exemple une erreur de base. Pas les corps de requête. | Selon le forfait Vercel |
| Journal d’erreurs d’administration (base) | Erreurs applicatives de certains endpoints et de l’interface web. Non utilisé sur le chemin MCP. | Géré par l’administrateur |
Ce qui ne s’y trouve pas :
- Aucun Sentry, Datadog, PostHog ni bibliothèque équivalente dans l’API. Une telle dépendance n’existe pas dans le projet.
- Aucun middleware capturant les corps de requête ou de réponse.
- Google Analytics et Microsoft Clarity ne se chargent que dans le navigateur, sur le site public, et seulement après le consentement aux cookies. Le trafic de l’API et du MCP ne les atteint jamais.
Vos droits sur les données
- Export : Réglages → Exporter les données produit un fichier contenant tous les enregistrements qui vous appartiennent, toutes collections confondues, sans secrets d’authentification ni journaux temporaires.
- Suppression : Réglages → Supprimer le compte efface l’utilisateur et chaque enregistrement qui lui est rattaché, y compris ceux liés à un groupe de dépenses partagées ou à un contact Family Legacy, ainsi que tous les fichiers. Une phrase de confirmation est demandée.
Ce que nous ne savons pas encore faire
Nous préférons l’écrire plutôt que vous laisser le découvrir.
- La confirmation est imposée comme un appariement, pas comme un consentement. Le serveur refuse une écriture dépourvue du jeton issu de l’aperçu correspondant, pour les mêmes arguments, dans les dix dernières minutes. Savoir si vous avez réellement vu l’aperçu et donné votre accord reste du ressort du client IA ; Claude et ChatGPT ajoutent leur propre demande d’autorisation d’outil.
- La durée de conservation des journaux côté hébergeur dépend du forfait Vercel et n’est pas pilotée par l’application.
Signaler un problème de sécurité
Écrivez à info@assetli.app en indiquant « security » en objet. Merci de ne pas faire de tests sur les données d’autres utilisateurs.