Finyvo Legal
Segurança
Esta página conta como o Finyvo é construído por dentro. A política de privacidade responde a que dados seus são tratados, para quê e com quem; aqui está o como: onde vive cada coisa, o que a protege, que decisões tomamos e quais ainda não. Sem selos nem superlativos.
Índice
Esta página conta como o Finyvo é construído por dentro. A política de privacidade responde a que dados seus são tratados, para quê e com quem; aqui está o como: onde vive cada coisa, o que a protege, que decisões tomamos e quais ainda não. Sem selos nem superlativos.
O essencial
| Pergunta | Resposta curta |
|---|---|
| Onde vivem seus dados financeiros? | No seu iPhone e, se você deixar a sincronização ativada, na base privada da sua própria conta iCloud. Em nenhum servidor nosso |
| Existe conta ou senha? | Não. O app se identifica com uma chave criptográfica que nasce dentro do Secure Enclave do seu iPhone e nunca sai de lá |
| O que protege o tráfego? | HTTPS com TLS 1.2 ou superior, em todas as conexões |
| Onde roda o backend? | Na Cloudflare Workers, com D1 e KV como único armazenamento |
| Onde estão as chaves dos provedores? | Só no backend, como segredos da Cloudflare. Nenhuma viaja dentro do app |
| Dá para desligar o que sai para a internet? | Sim. A sincronização com o iCloud e a inteligência artificial têm chave própria |
| Há certificações de segurança? | Não. Nem SOC 2 nem ISO 27001. O detalhe está em O que ainda não existe |
No seu iPhone
Quase todo o Finyvo acontece no seu dispositivo. O banco de dados, os cálculos, os orçamentos, os relatórios e a exportação: nada disso precisa de um servidor.
O banco de dados. Suas transações, carteiras, categorias, etiquetas, orçamentos, metas e assinaturas vivem no SwiftData, o framework de armazenamento local da Apple, que por baixo é SQLite. Os arquivos ficam dentro do contêiner do Aplicativo com a proteção de dados do iOS, na classe NSFileProtectionCompleteUntilFirstUserAuthentication: se o seu iPhone tem código de acesso, eles ficam criptografados em repouso até o primeiro desbloqueio depois de ligar o aparelho.
As preferências. O idioma, o tema, a moeda preferida, o modo privado e o estado das chaves de inteligência artificial ficam em UserDefaults, o armazenamento de ajustes do sistema. Nada financeiro vai para lá.
As Chaves (Keychain). Guardamos ali exatamente duas coisas, e nenhuma é um dado seu:
| O quê | Classe de acessibilidade | O que significa na prática |
|---|---|---|
| Identificador da chave do App Attest | kSecAttrAccessibleWhenUnlockedThisDeviceOnly |
Só é lido com o iPhone desbloqueado, e só neste dispositivo |
| Token de sessão do backend (15 minutos) | kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly |
É lido após o primeiro desbloqueio desde que você ligou o telefone, para o app poder trabalhar em segundo plano — reprogramar avisos, atualizar taxas — sem esperar você desbloquear. Também só neste dispositivo |
Nenhum é marcado como sincronizável: não viajam para as Chaves do iCloud nem são restaurados em outro dispositivo. Por design do iOS, os itens das Chaves podem sobreviver à desinstalação do app; são eliminados ao redefinir o dispositivo.
A chave privada não está nessa tabela porque nós não a temos. Ela vive dentro do Secure Enclave, o coprocessador de segurança do iPhone. Nem o Aplicativo nem nós conseguimos lê-la: só pedir assinaturas a ela. O que guardamos nas Chaves é o identificador dela.
Os backups. Antes de cada mudança de formato interno do banco de dados, o Aplicativo guarda uma cópia dentro do seu próprio contêiner e mantém até 7, rotativas. São locais: não sobem para nenhum servidor nosso. Se uma atualização de formato falhar, o app restaura a última cópia sozinho e tenta de novo; você também pode escolher uma manualmente em Ajustes → Zona avançada → Recuperar do backup.
O modo privado, e até onde ele vai. O ícone do olho na tela de Início esconde todos os valores de uma vez, incluindo o que o VoiceOver lê em voz alta. É um controle visual: não criptografa nada nem bloqueia o acesso ao app. O Finyvo não inclui bloqueio por Face ID, Touch ID nem código próprio; o código de acesso do iOS é hoje a única porta.
Sua cópia no iCloud
Se você deixar a sincronização ativada — ela vem ativada —, seus dados são replicados para a base de dados privada da sua própria conta iCloud, dentro do contêiner iCloud.com.moiszr.finyvo. É infraestrutura da Apple e a conta é sua: a Apple a criptografa em trânsito e em repouso, e o Finyvo não consegue consultá-la. Ela não aparece em nenhum painel nosso. Se você tem a Proteção Avançada de Dados da Apple ativada, essa cópia fica ainda criptografada de ponta a ponta.
Você pode desligar em Ajustes → Sincronização → iCloud. A mudança vale na próxima vez que abrir o app, e com ela desligada seus dados financeiros não saem do dispositivo.
Desligar não apaga o que já subiu. O Aplicativo não tem um botão de “apagar minha cópia do iCloud”: para eliminá-la é preciso ir em Ajustes do iOS → [Seu nome] → iCloud → Gerenciar armazenamento da conta → Finyvo.
O que é replicado exatamente, e o que acontece com o seu nome de exibição, está na política de privacidade.
Como o app se autentica
O Finyvo não tem contas. Não há e-mail, nem senha, nem login que alguém possa adivinhar, vazar ou roubar de você. O backend verifica algo diferente: que quem chama é o app real, rodando em um dispositivo real.
A chave. Na primeira abertura, o Aplicativo gera uma chave criptográfica dentro do Secure Enclave. A parte privada nunca sai desse chip: nem o app, nem o iOS, nem nós conseguimos lê-la. Só é possível pedir que ela assine.
O handshake, passo a passo:
- O app pede um desafio a
/auth/challenge. O backend devolve um número aleatório de uso único, com 5 minutos de vida. - O app pede ao Secure Enclave uma atestação sobre esse desafio e a envia a
/attest/verify. Aqui entra a Apple: a atestação demonstra que a chave nasceu em um dispositivo real e que quem a usa é uma cópia legítima do Finyvo. - Se tudo bate, o backend queima o desafio — um já usado não é aceito duas vezes — e emite duas coisas: um identificador de instalação e um token de sessão que expira em 15 minutos.
- A partir daí, cada chamada a
/fx/*,/brand/*,/ai/*e/import/*viaja com esse token. Nenhuma função do Aplicativo usa um token anônimo compartilhado. - Quando faltam uns dois minutos para o token expirar, o app o renova sozinho: desafio novo, assinatura nova do Secure Enclave, token novo. Se uma requisição cruzar com a expiração e voltar um 401, ele renova e tenta de novo uma vez.
A chave que está no binário, sim. As três requisições do handshake ainda não podem levar um token de sessão — elas existem para obtê-lo —, então se identificam com uma chave de aplicativo incluída no binário e, portanto, comum a todas as cópias do Finyvo. Qualquer pessoa que extraia o binário pode lê-la, e por isso ela não é a fronteira de segurança: serve para filtrar ruído de fundo. A fronteira real é a atestação do Secure Enclave, que não se falsifica copiando uma cadeia de texto. Essa chave também não identifica você.
O simulador. O App Attest não existe no simulador do Xcode, então as compilações de desenvolvimento têm um atalho para pulá-lo. Esse atalho não viaja no binário publicado na App Store, e o backend só o aceita quando tem configurado um segredo de desenvolvimento, que em produção não existe.
O que é o identificador de instalação. É pseudônimo e persiste enquanto o app estiver instalado; o backend o usa para contar sua cota mensal de inteligência artificial, resolver se você tem o Finyvo Plus e bloquear abusos. O que ele significa como dado pessoal, e com o que se cruza, está explicado na política de privacidade.
Em trânsito
Tudo viaja criptografado com HTTPS / TLS 1.2 ou superior: entre o Aplicativo e o nosso backend, e entre o nosso backend e os provedores externos. Não há nenhum caminho em texto puro.
Nosso backend exige TLS e responde sempre com estes cabeçalhos:
| Cabeçalho | Valor | Para quê |
|---|---|---|
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
Um ano de HTTPS obrigatório, subdomínios incluídos |
Content-Security-Policy |
default-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none' |
A API não serve páginas: não pode carregar recursos, nem ser incorporada, nem enviar formulários |
X-Frame-Options |
DENY |
O mesmo, para navegadores antigos |
X-Content-Type-Options |
nosniff |
Ninguém reinterpreta o tipo de uma resposta |
Referrer-Policy |
no-referrer |
Nenhum endereço nosso vaza para fora |
Permissions-Policy |
geolocation=(), microphone=(), camera=() |
A API não pede sensores, e isso fica escrito |
Cross-Origin-Resource-Policy / Cross-Origin-Opener-Policy |
same-site / same-origin |
Isola as respostas de outras origens |
Cache-Control |
no-store |
Nada fica em caches intermediários. A exceção são os logotipos de marca, que são públicos e são cacheados |
O site finyvo.com não instala cookies nem carrega recursos de terceiros: as fontes ficam hospedadas no nosso próprio domínio.
Como o backend é construído
api.finyvo.com roda sobre Cloudflare Workers: código executado na borda da rede, no data center mais próximo de você. Não há uma máquina nossa ligada em lugar nenhum e, portanto, não há servidor para atualizar, nem porta aberta para vigiar, nem disco onde as coisas se acumulem por esquecimento.
O backend faz dois trabalhos: proxy para os provedores externos e porteiro das funções pagas.
Tudo o que persiste cabe em dois serviços, e nenhum guarda informação financeira sua:
| Onde | O que guarda |
|---|---|
| Cloudflare D1 (banco de dados SQL) | Taxas de câmbio históricas, o registro de instalações e métricas técnicas de uso de inteligência artificial: qual função, qual modelo, quantos tokens, quanto demorou e se teve sucesso |
| Cloudflare KV (chave-valor) | Caches de taxas, símbolos e buscas de marca, os desafios do handshake e os contadores dos limites de requisições. Tudo com expiração automática |
A Cloudflare criptografa em repouso o que guarda no D1. Fora do D1 e do KV, os Workers não têm armazenamento persistente.
O corpo das requisições de inteligência artificial não é guardado. Nem a solicitação nem a resposta. O único que fica é a métrica técnica da tabela acima.
As chaves dos provedores externos vivem unicamente aqui, como segredos da Cloudflare: a do provedor de taxas de câmbio, a do Brandfetch e a do provedor de modelos de linguagem. Nenhuma viaja dentro do Aplicativo nem é entregue ao cliente em nenhuma resposta. Essa é a razão de o backend existir como proxy em vez de o app chamar cada provedor diretamente: uma chave embutida em um app instalado em milhares de telefones é uma chave publicada.
Os registros operacionais — rota, código de status, duração, identificador de requisição — a Cloudflare conserva por até 30 dias e não são exportados a nenhum outro serviço nosso. Que dados pessoais podem aparecer neles, e por quanto tempo, está detalhado na política de privacidade.
Os alertas internos de saúde são enviados por ntfy com metadados operacionais: código de status, rota, identificador de requisição e contadores. O endereço IP não é enviado a esse serviço, e isso é uma decisão de design, não um acaso.
Limites e antiabuso
Os limites existem para que um abuso não derrube o serviço nem dispare a fatura de um provedor. Hoje são estes:
| Limite | Alcance |
|---|---|
| 60 requisições por minuto | Por endereço IP, sobre as rotas da API |
| 10 requisições por minuto | Por endereço IP, só em /attest/verify — o passo mais caro do handshake |
| 10 requisições por minuto | Por instalação, em /import/* |
/health e as rotas que não são API ficam isentas: os scanners automáticos que rondam qualquer domínio público não consomem contadores.
Já não existem limites por token. Eles desapareceram com o App Attest: quando o app usava um token estático compartilhado, o limite era do token e não de quem chamava, então não media nada útil.
Quando algo passa do limite, a resposta é um 429 com os cabeçalhos Retry-After e X-RateLimit-*, para o cliente saber quanto esperar. E se o armazenamento de contadores cair, o limitador deixa passar em vez de bloquear: entre uma falha nossa deixar você sem taxas de câmbio e um minuto de requisições não ser contado, escolhemos o segundo.
À parte disso, e diferente: a cota mensal de inteligência artificial do plano gratuito, que o backend conta por instalação. É um limite de plano, não de segurança; está descrito na política de privacidade.
As chaves são suas
Duas coisas tiram dados do seu dispositivo, e as duas se desligam nos Ajustes:
- Sincronização com o iCloud — Ajustes → Sincronização → iCloud. Com ela desligada, seus dados financeiros não saem do iPhone. A mudança vale a partir da próxima abertura.
- Inteligência artificial — Ajustes → Inteligência artificial. Uma chave geral e cinco por função. Com a geral desligada, nenhuma chamada de inteligência artificial sai do app, incluídas as do fluxo de importação de arquivos. O Aplicativo passa a usar só os motores locais, que funcionam sem conexão, e a importação vai direto para o mapeamento manual de colunas.
Dois avisos sobre o momento em que esses dados saem:
- A categorização por inteligência artificial dispara ao sair do campo de descrição, antes de salvar. Se você escreve uma descrição e depois cancela a transação, esse texto e esse valor já foram enviados.
- O nome que você der a uma assinatura é usado tal qual para buscar o logotipo dela, e sai do seu dispositivo dentro do endereço da requisição. Não escreva ali dados pessoais nem de outras pessoas. Você pode mudá-lo quando quiser no editor.
A saída. Ajustes → Dados → Exportar meus dados gera um ZIP com seus dados completos dentro do iPhone: sem conexão, sem passar por nenhum servidor e sem precisar do Finyvo Plus. Esse arquivo sai sem criptografia e sem senha: assim que você o compartilha ou o guarda fora do app, ele deixa de estar protegido pelo contêiner do Aplicativo. Guarde-o em um lugar seguro.
A exclusão. Ajustes → Zona avançada → Redefinir todos os dados esvazia o banco de dados do Aplicativo. Lembre que isso não elimina por si só o contêiner do iCloud: para isso estão os ajustes do sistema, como explicado acima.
O que ainda não existe
O Finyvo é desenvolvido por uma pessoa. Isto é o que hoje ele não tem, dito com a mesma precisão do que sim tem:
- Certificações. Não temos SOC 2, nem ISO 27001, nem nenhum selo equivalente. São auditorias pensadas para empresas que custodiam os dados dos seus clientes nos próprios servidores; o Finyvo não custodia os seus, eles vivem no seu iPhone e no seu iCloud. Se algum dia esse modelo mudar, esta página dirá antes.
- Auditoria externa e programa de recompensas. Não publicamos um relatório de pentest nem temos um programa de bug bounty. O canal para reportar está logo abaixo, e é lido.
- Bloqueio dentro do app. Não há Face ID, Touch ID nem código próprio. Se alguém está com o seu iPhone desbloqueado, pode abrir o Finyvo.
- Exportação criptografada. O ZIP de exportação sai sem criptografia.
- Apagar sua cópia do iCloud pelo app. Esse botão não existe; é feito pelos ajustes do iOS.
- Itens das Chaves depois de desinstalar. Por design do iOS, podem sobreviver à desinstalação. São duas credenciais técnicas, não dados seus, e são eliminados ao redefinir o dispositivo.
Quando alguma destas mudar, esta página muda com ela.
Reportar uma falha de segurança
Se você encontrar algo — no app, no backend ou no site — escreva para [email protected] com o assunto Segurança.
Conte o que encontrou e como reproduzir. Se puder, inclua a versão do app e a hora aproximada: ajuda a localizar a requisição nos registros, que só vivem 30 dias.
O que pedimos: nos dê tempo de corrigir antes de publicar, e não acesse dados de outras pessoas nem degrade o serviço enquanto investiga. Não há recompensa financeira; há crédito público aqui, se você quiser.
Respondemos em no máximo 30 dias corridos, o mesmo compromisso que aplicamos a qualquer solicitação de privacidade.