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.

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