Segurança

Segurança, sem rodeios

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

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.

Onde é armazenado

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.

Como é apagado

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

Autenticação

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.

Criptografia «at rest»

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.

Isolamento de dados do usuário

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.

Sessões e revocation

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.

GDPR e privacidade

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.

Auditoria e observabilidade

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

  • Não vendemos nem compartilhamos seus dados com terceiros. Nossa fonte de receita é a assinatura Pro, não anúncios.
  • Não rodamos analytics web nem trackers nas páginas do usuário — sem Google Analytics, Mixpanel, Hotjar.
  • Não guardamos senhas em texto claro — bcrypt com 12 rounds, sem backdoor-recovery.
  • Não embedamos seu saldo ou transações em sites parceiros — sem widget, nada para vazar.

Sincronização bancária — o que é compartilhado de fato

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.

O que você pode verificar sozinho

Toda afirmação acima é auditável via código e API.

  • Criptografia: src/lib/crypto.ts (AES-256-GCM, randomBytes IV, auth tag).
  • Autenticação: src/auth.ts, src/lib/auth/rate-limit.ts.
  • Autorização: src/lib/auth/ownership.ts (assertCanAccessAccount).
  • API aberta: https://app.my-fina.com/api/openapi (OpenAPI 3.1).
  • Health endpoint: https://app.my-fina.com/api/health (liveness público).

Receber avisos de segurança

Inscreva-se para saber de CVEs, patches de segurança e mudanças no modelo de ameaças. Sem marketing.

Avisar-me quando o Pro estiver disponível

Um email. Sem spam. Cancelar em um clique.

Conforme com GDPR · dados processados na UEÚltima atualização: 3 de junho de 2026