Sécurité

La sécurité, simplement

MyFina est une comptabilité domestique. Les données financières sont sensibles — voici comment elles sont protégées, sans blabla marketing.

Trois réponses brèves aux grandes questions

Comment c'est chiffré

TLS 1.3 en transit (Let's Encrypt). Clés d'API externes, jetons bancaires et secrets de courtiers — AES-256-GCM avec un IV unique par enregistrement. Mots de passe — bcrypt (12 tours). La clé de chiffrement vit dans env, pas dans la base.

Où c'est stocké

PostgreSQL 16 dans une instance managée chez Hetzner (Allemagne, UE). Réseau Docker isolé, aucune connexion externe à la base. Sauvegardes — quotidiennes, chiffrées avant envoi, rétention de 30 jours.

Comment c'est supprimé

Hard-delete du compte d'un seul coup : transactions, comptes, catégories, devises, jetons sont supprimés en cascade. Pas de tables soft-delete, pas d'archive « au cas où ». Leads marketing sous le même e-mail — erase-hook séparé (GDPR Art. 17).

Six piliers de défense

Authentification

NextAuth.js v5 sur JWT, mots de passe hachés avec bcrypt. Throttling de connexion — 5 tentatives / 15 min par identifiant et 20 / 15 min par IP. OAuth Google en option. Réinitialisation de mot de passe via un jeton de 32 octets ; seul son SHA-256 est stocké.

Chiffrement « at rest »

Les clés d'API externes (banques, Resend, Anthropic) et les secrets de courtiers sont chiffrés avec AES-256-GCM. La clé ne quitte jamais le serveur. Chaque connexion bancaire porte son propre secret webhook hex de 32 octets.

Isolation des données utilisateur

Chaque UPDATE/DELETE filtre par `userId`. La protection IDOR est centralisée dans `assertCanAccessAccount/Category` — un accès au compte d'autrui renvoie 403, pas 404. Les comptes familiaux partagés utilisent les rôles explicites OWNER/MEMBER/VIEWER.

Sessions et revocation

JWT avec un `session_version` qui s'incrémente. Changement de mot de passe, blocage de compte ou changement de rôle invalident toutes les sessions actives. Les refresh tokens de l'API mobile tournent à chaque rafraîchissement.

GDPR et confidentialité

Le hard-delete du compte supprime en cascade toutes les transactions, comptes et catégories dans une seule transaction. Export des données — CSV/XLSX/PDF en un clic. Cookie consent à deux catégories (essential / functional), sans analytics ni trackers.

Audit et observabilité

Toutes les actions admin et opérations utilisateur sensibles sont écrites dans `audit_log` avec IP, user-agent et source. Les logs de tentatives de connexion sont conservés 30 jours. Les events webhook Stripe occupent un journal d'idempotency dédié pour rejouer en cas d'échec.

Ce que nous NE faisons PAS

  • Nous ne vendons ni ne partageons vos données avec des tiers. Notre source de revenu est l'abonnement Pro, pas la publicité.
  • Nous ne faisons pas d'analytique web ni de trackers sur les pages utilisateurs — pas de Google Analytics, Mixpanel, Hotjar.
  • Nous ne stockons pas les mots de passe en clair — bcrypt 12 tours, pas de backdoor-recovery.
  • Nous n'intégrons pas votre solde ou vos transactions sur des sites partenaires — aucun widget, rien à fuiter.

Synchronisation bancaire — ce qui est exactement partagé

Si vous connectez Monobank ou une banque PSD2 via GoCardless, nous recevons uniquement ce qu'il faut pour synchroniser les transactions : paiements sortants, virements entrants, soldes des comptes. Aucune donnée personnelle côté banque (passeport, photo, biométrie). Le jeton d'API bancaire est stocké chiffré avec AES-256-GCM ; vous pouvez révoquer l'accès en un clic depuis Réglages → Banques. Le consentement GoCardless expire tous les 90 jours selon PSD2 — nous vous prévenons 7 jours à l'avance.

Questions fréquentes sur la sécurité

Où se trouvent physiquement les serveurs et qui possède les données ?

Les serveurs sont hébergés au centre de données Hetzner à Francfort, Allemagne (UE). Le responsable du traitement est le propriétaire de MyFina — pas d'intermédiaires agrégateurs, pas de fournisseurs cloud basés aux États-Unis. La liste complète des sous-traitants est sur /security/subprocessors.

Que se passera-t-il pour mes données si MyFina ferme ?

Au moins 30 jours avant, nous vous enverrons un email avec une notification et un bouton « Tout télécharger » aux formats CSV / XLSX / PDF. Après la période de grâce, la base de données sera détruite. C'est un engagement opérationnel dans nos Conditions, pas une promesse marketing.

Puis-je supprimer mon compte complètement ?

Oui. Paramètres → Données → Supprimer le compte est un hard-delete dans une seule transaction DB : transactions, comptes, catégories, jetons et leads marketing liés au même email sont effacés en cascade. Pas de soft-delete, pas d'archives « au cas où ». Entièrement conforme à l'Art. 17 du RGPD.

Qui à l'intérieur de MyFina voit mes données financières ?

Personne du « personnel » n'a un accès routinier à vos données financières. Le propriétaire ne peut accéder à la base de données que lors d'un incident de sécurité ou avec votre demande explicite via le support. Toutes les actions admin sont enregistrées dans audit_log avec IP et user-agent.

Si on me vole mon ordinateur portable — le mot de passe MyFina me protégera-t-il ?

Les sessions du navigateur sont des JWTs avec TTL, pas « connecté à vie ». Si votre navigateur actuel est déconnecté, personne ne peut se connecter sans le mot de passe. Avec une session active — utilisez le lock-screen de l'OS et/ou changez le mot de passe depuis un autre appareil (cela invalide toutes les sessions actives instantanément).

Êtes-vous connecté à Google Analytics, Facebook Pixel ou d'autres traceurs ?

Non. Nous n'exécutons aucun script d'analyse sur les pages utilisateur. La bannière cookies ne montre que deux catégories — essential (session NextAuth) et functional (liens de parrainage). Pas de catégorie analytics, car il n'y a rien à analyser.

Ce que vous pouvez vérifier vous-même

Chaque affirmation ci-dessus est auditable via le code et l'API.

  • Chiffrement : src/lib/crypto.ts (AES-256-GCM, randomBytes IV, auth tag).
  • Authentification : src/auth.ts, src/lib/auth/rate-limit.ts.
  • Autorisation : src/lib/auth/ownership.ts (assertCanAccessAccount).
  • Open API : https://app.my-fina.com/api/openapi (OpenAPI 3.1).
  • Endpoint health : https://app.my-fina.com/api/health (liveness public).

Recevoir les avis de sécurité

Abonnez-vous pour être informé des CVE, des patches de sécurité et des évolutions du modèle de menaces. Pas de marketing.

Me notifier quand Pro sera disponible

Un email. Pas de spam. Désinscription en un clic.

Conforme GDPR · données traitées dans l'UEDernière mise à jour : 3 juin 2026