Sicurezza

Sicurezza, in modo chiaro

MyFina è una contabilità domestica. I dati finanziari sono speciali — ti mostriamo come sono protetti, senza paroloni di marketing.

Tre risposte brevi alle grandi domande

Come si cifra

TLS 1.3 in transit (Let's Encrypt). Chiavi API esterne, token bancari e segreti dei broker — AES-256-GCM con IV unico per record. Password — bcrypt (12 round). La chiave di cifratura vive in env, non nel database.

Dove si conserva

PostgreSQL 16 in un'istanza gestita su Hetzner (Germania, UE). Rete Docker isolata, nessuna connessione esterna al DB. Backup — giornalieri, cifrati prima dell'upload, retention di 30 giorni.

Come si cancella

Hard-delete dell'account in un solo passaggio: transazioni, conti, categorie, valute, token vengono rimossi a cascata. Niente tabelle soft-delete, niente archivio «per ogni evenienza». Lead marketing sotto la stessa email — erase-hook separato (GDPR Art. 17).

Sei pilastri di difesa

Autenticazione

NextAuth.js v5 su JWT, password hashate con bcrypt. Throttling del login — 5 tentativi / 15 min per identifier e 20 / 15 min per IP. OAuth Google opzionale. Reset password tramite token da 32 byte; nel database resta solo il suo SHA-256.

Cifratura «at rest»

Le chiavi API esterne (banche, Resend, Anthropic) e i segreti dei broker sono cifrati con AES-256-GCM. La chiave non lascia mai il server. Ogni connessione bancaria porta il proprio secret webhook hex da 32 byte.

Isolamento dei dati utente

Ogni operazione UPDATE/DELETE filtra per `userId`. La protezione IDOR è centralizzata in `assertCanAccessAccount/Category` — l'accesso al conto di un altro restituisce 403, non 404. I conti familiari condivisi usano ruoli espliciti OWNER/MEMBER/VIEWER.

Sessioni e revocation

JWT con `session_version` incrementale. Cambio password, blocco account o cambio ruolo invalidano tutte le sessioni attive. I refresh token della Mobile-API ruotano a ogni refresh.

GDPR e privacy

L'hard-delete dell'account rimuove tutte le transazioni, i conti e le categorie a cascata in un'unica transazione. Export dati — CSV/XLSX/PDF con un click. Cookie consent con due categorie (essential / functional), nessuna analitica, nessun tracker.

Audit e osservabilità

Tutte le azioni admin e le operazioni sensibili dell'utente vengono scritte in `audit_log` con IP, user-agent e source. I log dei tentativi di login sono conservati 30 giorni. Gli eventi webhook di Stripe risiedono in un journal di idempotency dedicato per replay sicuro in caso di errore.

Cosa NON facciamo

  • Non vendiamo né condividiamo i tuoi dati con terzi. La nostra fonte di entrate è l'abbonamento Pro, non la pubblicità.
  • Non eseguiamo analytics web né tracker sulle pagine utente — niente Google Analytics, Mixpanel, Hotjar.
  • Non salviamo password in chiaro — bcrypt 12 round, niente backdoor-recovery.
  • Non embeddiamo saldo o transazioni su siti partner — nessun widget, niente da leakare.

Sincronizzazione bancaria — cosa viene esattamente condiviso

Se colleghi Monobank o una banca PSD2 tramite GoCardless, riceviamo solo ciò che serve a sincronizzare le transazioni: pagamenti in uscita, bonifici in entrata, saldi dei conti. Nessun dato personale lato banca (passaporto, foto, biometria). Il token API della banca è conservato cifrato con AES-256-GCM; puoi revocare l'accesso con un click da Impostazioni → Banche. Il consenso GoCardless scade ogni 90 giorni come previsto dalla PSD2 — ti avvisiamo 7 giorni prima.

Cosa puoi verificare tu stesso

Ogni affermazione qui sopra è auditabile tramite codice e API.

  • Cifratura: src/lib/crypto.ts (AES-256-GCM, randomBytes IV, auth tag).
  • Autenticazione: src/auth.ts, src/lib/auth/rate-limit.ts.
  • Autorizzazione: src/lib/auth/ownership.ts (assertCanAccessAccount).
  • API aperta: https://app.my-fina.com/api/openapi (OpenAPI 3.1).
  • Endpoint health: https://app.my-fina.com/api/health (liveness pubblico).

Ricevere avvisi di sicurezza

Iscriviti per sapere di CVE, patch di sicurezza e modifiche al modello di minaccia. Niente marketing.

Avvisami quando Pro sarà disponibile

Una email. Niente spam. Cancellazione con un clic.

Conforme al GDPR · dati trattati nell'UEUltimo aggiornamento: 3 giugno 2026