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.

Perguntas frequentes sobre segurança

Onde estão fisicamente os servidores e quem detém os dados?

Os servidores estão no centro de dados Hetzner em Frankfurt, Alemanha (UE). O controlador de dados é o proprietário do MyFina — sem intermediários agregadores, sem fornecedores de nuvem dos EUA. A lista completa de subprocessadores está em /security/subprocessors.

O que acontece aos meus dados se o MyFina encerrar?

Pelo menos 30 dias antes enviaremos um email com notificação e um botão "Descarregar tudo" em formatos CSV / XLSX / PDF. Após o período de graça a base de dados será destruída. É um compromisso operacional nos Termos, não uma promessa de marketing.

Posso eliminar a minha conta completamente?

Sim. Definições → Dados → Eliminar conta é um hard-delete numa única transação DB: transações, contas, categorias, tokens e leads de marketing ligados ao mesmo email são apagados em cascata. Sem soft-delete, sem arquivos "por precaução". Totalmente conforme RGPD art. 17.

Quem dentro do MyFina vê os meus dados financeiros?

Ninguém do "pessoal" tem acesso rotineiro aos teus dados financeiros. O proprietário só acede à base de dados durante um incidente de segurança ou com o teu pedido explícito via support. Todas as ações de admin são registadas em audit_log com IP e user-agent.

Se roubarem o meu portátil — a palavra-passe do MyFina protege-me?

As sessões do browser são JWTs com TTL, não "sessão iniciada para sempre". Se o teu browser atual está terminado, ninguém entra sem a palavra-passe. Com sessão ativa — usa lock-screen do SO e/ou muda a palavra-passe de outro dispositivo (isto invalida todas as sessões ativas imediatamente).

Estão ligados ao Google Analytics, Facebook Pixel ou outros trackers?

Não. Não corremos nenhum script de analítica nas páginas de utilizador. O banner de cookies mostra apenas duas categorias — essential (sessão NextAuth) e functional (links de referência). Sem categoria analytics, porque não há nada para analisar.

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