Aller au contenu principal

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
Application et APIVercel, région de Francfort (fra1)
Base de donnéesMongoDB 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 baseArchive mongodump chiffrée en AES-256 avant de quitter le serveur de build, conservée 30 jours comme artefact GitHub Actions
Taux de changeRécupérés auprès de frankfurter.app (taux BCE). La requête ne contient que des codes de devises
PaiementsStripe. 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.

  1. Votre client appelle POST /api/mcp avec un corps JSON-RPC, c’est-à-dire le nom de l’outil et ses arguments. Rien d’autre de la conversation n’est envoyé.
  2. 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é.
  3. Vérification du jeton. Le jeton de l’en-tête Authorization: Bearer est 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.
  4. Autorisation, forfait et jeton d’aperçu. Un outil d’écriture exige l’autorisation write et 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.
  5. 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.
  6. 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_logs avec 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.
  7. 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èleNon. Elles restent dans le client IA.
Nom de l’outil et argumentsOui, le temps du traitement de la requête.
Arguments des appels d’écritureOui, sous forme de résumé sans texte libre, douze mois dans le journal d’audit.
Arguments des appels de lectureNe sont pas conservés.
Résultats des outilsCalculés et renvoyés, non conservés.
Identité du clientLe 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.app est 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/mcp et nulle part ailleurs. L’API REST n’accepte les jetons Bearer que de notre propre application mobile.

Journalisation

JournalContenuConservation
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.