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.
Sicurezza
MyFina è una contabilità domestica. I dati finanziari sono speciali — ti mostriamo come sono protetti, senza paroloni di marketing.
Tre risposte brevi alle grandi domande
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.
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.
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
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.
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.
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.
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.
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.
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
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.
Dettagli più approfonditi
Elenco completo dei servizi di terze parti che trattano i tuoi dati: Hetzner (hosting), Stripe (fatturazione), Resend (email), Anthropic (AI, DRAFT), GoCardless (PSD2), Monobank API, FCM.
Apri elencoMatrice per-feature: cosa viene salvato, per quanto tempo, come viene eliminato. Flusso GDPR Art. 15/17/20 e finestre di retention per entità.
Apri matriceCosa puoi verificare tu stesso
Ogni affermazione qui sopra è auditabile tramite codice e API.
src/lib/crypto.ts (AES-256-GCM, randomBytes IV, auth tag).src/auth.ts, src/lib/auth/rate-limit.ts.src/lib/auth/ownership.ts (assertCanAccessAccount).https://app.my-fina.com/api/openapi (OpenAPI 3.1).https://app.my-fina.com/api/health (liveness pubblico).Iscriviti per sapere di CVE, patch di sicurezza e modifiche al modello di minaccia. Niente marketing.