Como é criptografado
TLS 1.3 em trânsito (Let's Encrypt). Chaves de API externas, tokens bancários e segredos de brokers — AES-256-GCM com IV único por registro. Senhas — bcrypt (12 rounds). A chave de criptografia vive em env, não no banco.
Segurança
A MyFina é uma contabilidade doméstica. Dados financeiros são especiais — aqui mostramos como são protegidos, sem enrolação de marketing.
Três respostas curtas para as perguntas importantes
TLS 1.3 em trânsito (Let's Encrypt). Chaves de API externas, tokens bancários e segredos de brokers — AES-256-GCM com IV único por registro. Senhas — bcrypt (12 rounds). A chave de criptografia vive em env, não no banco.
PostgreSQL 16 em instância gerenciada na Hetzner (Alemanha, UE). Rede Docker isolada, sem conexões externas ao banco. Backups — diários, criptografados antes do upload, retenção de 30 dias.
Hard-delete da conta em um passo só: transações, contas, categorias, moedas e tokens são removidos em cascata. Sem tabelas soft-delete, sem arquivo «por via das dúvidas». Leads de marketing com o mesmo e-mail — erase-hook separado (GDPR Art. 17).
Seis pilares de defesa
NextAuth.js v5 sobre JWT, senhas com hash bcrypt. Login throttling — 5 tentativas / 15 min por identificador e 20 / 15 min por IP. OAuth do Google opcional. Reset de senha via token de 32 bytes; no banco fica apenas seu SHA-256.
Chaves de API externas (bancos, Resend, Anthropic) e segredos de brokers são criptografados com AES-256-GCM. A chave nunca sai do servidor. Cada conexão bancária carrega seu próprio webhook secret hex de 32 bytes.
Toda operação UPDATE/DELETE filtra por `userId`. A proteção IDOR é centralizada em `assertCanAccessAccount/Category` — acesso à conta de outro retorna 403, não 404. Contas familiares compartilhadas usam papéis explícitos OWNER/MEMBER/VIEWER.
JWT com `session_version` incremental. Mudança de senha, bloqueio de conta ou troca de papel invalidam todas as sessões ativas. Refresh tokens da API móvel rotacionam a cada refresh.
O hard-delete da conta remove todas as transações, contas e categorias em cascata em uma única transação. Exportação de dados — CSV/XLSX/PDF com um clique. Cookie consent com duas categorias (essential / functional), sem analytics nem trackers.
Todas as ações de admin e operações sensíveis do usuário são gravadas em `audit_log` com IP, user-agent e source. Logs de tentativas de login ficam 30 dias. Eventos de webhook do Stripe ficam em um journal de idempotency dedicado para replay seguro em falhas.
O que NÃO fazemos
Se você conecta Monobank ou um banco PSD2 via GoCardless, recebemos apenas o necessário para sincronizar transações: pagamentos de saída, transferências de entrada, saldos das contas. Nenhum dado pessoal do lado do banco (passaporte, foto, biometria). O token de API do banco fica armazenado criptografado com AES-256-GCM; você pode revogar o acesso com um clique em Configurações → Bancos. O consentimento do GoCardless expira a cada 90 dias por exigência da PSD2 — lembramos 7 dias antes.
Detalhes mais profundos
Lista completa de serviços de terceiros que processam seus dados: Hetzner (hosting), Stripe (cobrança), Resend (e-mail), Anthropic (AI, DRAFT), GoCardless (PSD2), Monobank API, FCM.
Abrir listaMatriz per-feature: o que é armazenado, por quanto tempo, como é apagado. Fluxo GDPR Art. 15/17/20 e janelas de retenção por entidade.
Abrir matrizO que você pode verificar sozinho
Toda afirmação acima é auditável via código 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 público).Inscreva-se para saber de CVEs, patches de segurança e mudanças no modelo de ameaças. Sem marketing.