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 matrizPerguntas frequentes sobre segurança
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.
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.
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.
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.
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).
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.
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.