Jak se šifruje
TLS 1.3 in transit (Let's Encrypt). Externí API klíče, bankovní tokeny a brokerské secrety — AES-256-GCM s unikátním IV na záznam. Hesla — bcrypt (12 kol). Šifrovací klíč žije v env, ne v DB.
Bezpečnost
MyFina je domácí účetnictví. Finanční data jsou výjimečná — ukazujeme, jak jsou chráněna, bez marketingové vaty.
Tři krátké odpovědi na hlavní otázky
TLS 1.3 in transit (Let's Encrypt). Externí API klíče, bankovní tokeny a brokerské secrety — AES-256-GCM s unikátním IV na záznam. Hesla — bcrypt (12 kol). Šifrovací klíč žije v env, ne v DB.
PostgreSQL 16 v managed instanci u Hetzneru (Německo, EU). Izolovaná Docker síť, žádná externí připojení k DB. Zálohy — denní, šifrované před uploadem, retence 30 dnů.
Hard-delete účtu v jednom kroku: kaskádně se odstraní transakce, účty, kategorie, měny, tokeny. Žádné soft-delete tabulky, žádný archiv „pro jistotu“. Marketingové leady na stejný email — samostatný erase-hook (GDPR čl. 17).
Šest pilířů obrany
NextAuth.js v5 na JWT, hesla hashována pomocí bcrypt. Login-throttling 5 pokusů / 15 min na identifikátor a 20 / 15 min na IP. OAuth Google volitelný. Reset hesla — 32-bytový token, v DB jen SHA-256.
Externí API klíče (banky, Resend, Anthropic) a brokerské secrety jsou šifrovány AES-256-GCM. Klíč nikdy neopouští server. Per-connection webhook-secrety — 32-byte hex pro každou bankovní integraci.
Každá UPDATE/DELETE operace filtruje podle `userId`. IDOR-ochrana je centralizovaná v `assertCanAccessAccount/Category` — pokus o přístup k cizímu účtu vrátí 403, ne 404. Sdílené rodinné účty fungují přes role OWNER/MEMBER/VIEWER.
JWT s inkrementálním `session_version`. Změna hesla, zablokování uživatele nebo změna role invalidují všechny aktivní relace. Refresh-tokeny mobilního API se rotují při každém obnovení.
Hard-delete účtu odstraní všechny transakce, účty a kategorie kaskádně v jedné transakci. Export dat — CSV/XLSX/PDF jedním kliknutím. Cookie consent se dvěma kategoriemi (essential / functional), bez analytiky a trackerů.
Všechny admin akce a citlivé uživatelské operace se zapisují do `audit_log` s IP, user-agent a source. Logy pokusů o přihlášení se uchovávají 30 dní. Stripe webhook události mají vlastní idempotency-žurnál pro bezpečný replay.
Co NEděláme
Pokud připojíte Monobank nebo PSD2 banku přes GoCardless, dostáváme jen to, co je potřeba k synchronizaci transakcí: odchozí platby, příchozí převody, zůstatky účtů. Žádná osobní data banky (pas, foto, biometrie). API-token banky se ukládá zašifrovaný AES-256-GCM; přístup můžete odebrat jedním kliknutím v Nastavení → Banky. GoCardless souhlas vyprší každých 90 dní podle PSD2 — upozorníme vás 7 dní předem.
Hlubší detaily
Úplný seznam externích služeb zpracovávajících vaše data: Hetzner (hosting), Stripe (fakturace), Resend (e-mail), Anthropic (AI, DRAFT), GoCardless (PSD2), Monobank API, FCM.
Otevřít seznamPer-feature matice: co se ukládá, jak dlouho, jak se maže. GDPR čl. 15/17/20 a retenční okna pro každou entitu.
Otevřít maticiCo si můžete sami ověřit
Každé tvrzení výše je auditovatelné v kódu a 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 (veřejný liveness).Přihlaste se k odběru CVE, bezpečnostních záplat a změn modelu hrozeb. Žádný marketing.