PlainApp — Segurança em Profundidade
Como o PlainApp protege seus dados na rede Wi-Fi local — com evidências do código open source.
Por Que a Segurança da Rede Local é Importante?
Quando você usa um aplicativo para gerenciar seu celular Android pelo navegador do PC, seus SMS, fotos, contatos e arquivos trafegam pela rede Wi-Fi. A maioria dos aplicativos envia tudo isso como texto legível. Qualquer pessoa na mesma rede pode ver.
Você pode pensar: "É meu Wi-Fi de casa, quem vai bisbilhotar?" Mas considere:
- Wi-Fi público — Cafés, aeroportos, hotéis — qualquer pessoa por perto pode capturar o tráfego
- Redes compartilhadas — Colegas de quarto, visitantes ou dispositivos IoT comprometidos
- Vulnerabilidades no roteador — Firmware desatualizado com falhas conhecidas
Se um aplicativo envia seus SMS como texto puro via HTTP, qualquer pessoa com uma ferramenta gratuita como o Wireshark consegue ler. Isso não é teoria — é trivialmente fácil.
A maioria dos aplicativos de gerenciamento de celular faz exatamente isso. Abra o Chrome DevTools (F12 → aba Network) enquanto usa a interface web, e você pode ler todas as chamadas de API em JSON legível — corpo dos SMS, caminhos de arquivos, nomes de contatos, tudo.
Como o PlainApp é Diferente
O PlainApp aplica múltiplas camadas de criptografia e autenticação. Veja o que cada camada faz, em linguagem simples.
API GraphQL — Solicite Apenas o Necessário
A maioria dos aplicativos usa APIs REST tradicionais: uma URL por recurso, retornando tudo independentemente da necessidade. O PlainApp usa GraphQL — uma abordagem moderna em que o navegador solicita exatamente os dados necessários, nada mais.
Por que isso importa:
- Menos dados expostos — Se você só precisa do nome de um arquivo, é tudo o que é enviado
- Um único endpoint — Há uma única URL /graphql em vez de dezenas, o que reduz a superfície de ataque
- Permissões por consulta — Cada consulta verifica sua própria permissão (ex.: ler SMS exige permissão READ_SMS mesmo após o login)
Chamadas de API Criptografadas (XChaCha20-Poly1305)
Esta é a maior diferença entre o PlainApp e a maioria dos concorrentes.
Cada requisição e resposta de API — incluindo tráfego HTTP e WebSocket — é criptografada com XChaCha20-Poly1305, tanto no modo HTTP quanto HTTPS. Este é um algoritmo de criptografia AEAD moderno utilizado pelo WireGuard VPN, Cloudflare e a biblioteca Tink do Google.
Em termos simples:
- 1Seu navegador constrói uma requisição (por exemplo, "mostre meus SMS")
- 2Adiciona um timestamp e um nonce aleatório para proteção contra replay
- 3Criptografa todo o payload em dados binários ilegíveis com XChaCha20-Poly1305
- 4O binário criptografado é enviado pela rede — sem base64, sem JSON, binário puro
- 5Somente seu telefone pode descriptografar e validar
Mesmo que alguém intercepte o tráfego, verá apenas dados binários sem sentido — não JSON legível.
Sobre a criptografia:
- Chave de 256 bits (extremamente forte)
- Nonce de 192 bits (previne certos tipos de ataque que afetam outras cifras)
- Detecção de adulteração integrada — se alguém modificar os dados em trânsito, a descriptografia falha
- Lado Android: utiliza Google Tink
- Lado web: utiliza @noble/ciphers (uma biblioteca JavaScript de criptografia bem auditada)
Assinaturas digitais (Ed25519) — Dispositivo a dispositivo
Quando dois dispositivos PlainApp se comunicam (por exemplo, chat de telefone para telefone), apenas a criptografia não é suficiente — cada dispositivo precisa verificar que a mensagem realmente veio do outro dispositivo e não foi forjada.
timestamp
O dispositivo receptor verifica a assinatura usando a chave pública do remetente e rejeita requisições com timestamp superior a 5 minutos. Isso previne tanto falsificação quanto ataques de replay.
Pareamento Seguro de Dispositivos (ECDH Key Exchange)
Quando dois dispositivos PlainApp se pareiam (ex.: dois celulares), eles precisam de uma chave de criptografia compartilhada. Mas enviar uma chave pela rede anularia o propósito.
O PlainApp resolve isso com ECDH (Elliptic Curve Diffie-Hellman) key exchange — a mesma matemática usada no TLS, no Secure Enclave da Apple e no WebAuthn:
- 1Cada dispositivo gera um par de chaves (pública + privada)
- 2Eles trocam apenas suas chaves públicas
- 3Cada dispositivo combina sua chave privada com a chave pública do outro
- 4Ambos chegam ao mesmo segredo compartilhado — sem que ele jamais trafegue pela rede
URLs Criptografadas — Ocultando Caminhos de Arquivos
Um detalhe que a maioria das pessoas não percebe: os caminhos das URLs também revelam informações.
Quando você baixa um arquivo, a URL indica ao servidor qual arquivo você quer. Em muitos aplicativos, a URL tem esta aparência:
/fs?path=/sdcard/DCIM/Camera/photo_2024.jpgQualquer pessoa analisando o tráfego (ou olhando o histórico do navegador) pode ver exatamente qual arquivo você acessou e a estrutura de pastas do seu celular.
O PlainApp criptografa o caminho do arquivo na URL:
/fs?id=AxK9f2mQ7vR3xP8nWz...O parâmetro id é o caminho do arquivo criptografado com XChaCha20-Poly1305 usando uma chave aleatória chamada URL Token. Por padrão, essa chave é permanente e persiste mesmo após reiniciar o app, de modo que links compartilhados continuam funcionando. Sem a chave, ninguém consegue adivinhar o caminho real, listar seus arquivos ou criar URLs de download.
HTTPS com Certificados Autoassinados
O PlainApp gera um certificado TLS autoassinado no seu celular. Isso cria um túnel HTTPS criptografado — a mesma tecnologia usada por bancos e sites.
O certificado utiliza:
- ECDSA com curva P-256 (mesma dos grandes sites)
- Assinatura SHA256
- Armazenado no diretório privado do aplicativo
Combinado com a criptografia XChaCha20 na camada de aplicação, isso oferece duas camadas independentes de criptografia. Quebrar uma não ajuda sem quebrar a outra.
Proteção de Login
O PlainApp limita tentativas de login para prevenir adivinhação de senha:
- 5 tentativas por 60 segundos por endereço IP
- Após isso, as conexões são rejeitadas
- Registros de rate limit expirados são limpos automaticamente
HTTP vs HTTPS: Uma Nota Honesta
O PlainApp oferece os modos HTTP e HTTPS. Veja a diferença honesta:
| Modo HTTP | Modo HTTPS | |
|---|---|---|
| URLs de caminhos de arquivos | Criptografado (XChaCha20) | Criptografado (XChaCha20) |
| Chamadas de API | Criptografado (XChaCha20) | Criptografado (XChaCha20 + TLS) |
| Download de arquivos | Não criptografado em trânsito | Criptografado por TLS |
| Para quem é indicado | Iniciantes (sem aviso de SSL no navegador) | Usuários preocupados com privacidade |
Ambos os modos criptografam chamadas de API com XChaCha20-Poly1305 — seus SMS, contatos e outros dados estão sempre criptografados, independentemente de HTTP ou HTTPS.
O modo HTTP existe porque certificados autoassinados disparam um aviso no navegador ("Sua conexão não é privada"). Para usuários menos técnicos, esse aviso é confuso e assustador. O HTTP evita esse atrito.
Porém, o modo HTTP não criptografa transferências de arquivos. Se você estiver em uma rede compartilhada ou pública, sempre use HTTPS.
Recomendação: Use HTTPS sempre que possível. Aceite o aviso de certificado autoassinado do navegador — é normal e esperado para um aplicativo de rede local.
Segurança da Cadeia de Suprimentos — Menos Dependências, Menos Risco
Uma ameaça de segurança em que muitos usuários não pensam: supply chain attacks. Quando um aplicativo usa centenas de bibliotecas de terceiros, qualquer uma delas pode ser comprometida — injetando código malicioso que rouba dados, minera criptomoedas ou abre backdoors.
Isso é especialmente perigoso no ecossistema JavaScript. Nos últimos anos, pacotes npm populares como event-stream, ua-parser-js e colors foram sequestrados para injetar código malicioso em milhões de projetos. Se a interface web de um aplicativo de gerenciamento de celular importa centenas de pacotes JS, cada um é um potencial vetor de ataque.
O PlainApp adota uma abordagem deliberada: usar o mínimo de dependências possível e construir código próprio quando faz sentido.
Aplicativo Android (plain-app)
- Sem framework de injeção de dependência (sem Hilt, sem Dagger) — utiliza singletons simples
- Criptografia gerenciada por apenas 3 bibliotecas reconhecidas: Google Tink, Bouncy Castle e a Java Cryptography Extension nativa
- Servidor roda em Ktor (framework oficial Kotlin da JetBrains) — sem bibliotecas de servidor obscuras de terceiros
Interface Web (plain-desktop)
Apenas 28 dependências em tempo de execução — muito menos que aplicativos web típicos. Diversas funcionalidades que normalmente exigiriam pacotes npm são construídas do zero:
| Funcionalidade | App Típico | PlainApp |
|---|---|---|
| Sons de notificação | howler.js / tone.js | Sintetizador Web Audio API customizado |
| Geração de UUID | pacote npm uuid | Implementação RFC 4122 escrita à mão |
| Upload de arquivos | uppy / axios | Upload chunked customizado com fila |
| Vídeo WebRTC | Twilio / Daily.co SDK | Código PeerConnection escrito à mão |
| Cliente HTTP | axios / ky | fetch nativo do navegador |
A criptografia no lado web utiliza @noble/ciphers — uma biblioteca JavaScript de criptografia bem auditada e sem dependências — em vez de alternativas grandes e inchadas.
Por que isso importa
Cada dependência adicionada é código que você não controla. A abordagem do PlainApp significa:
- Menos lugares para código malicioso se esconder
- Menor superfície de ataque
- Mais fácil de auditar (todo o código-fonte é open source)
- Sem risco de pacotes npm abandonados ou sequestrados
O Que Muitos Concorrentes Erram
Não se trata de citar aplicativos específicos. São padrões comuns na categoria:
| Aspecto de Segurança | PlainApp | Comum nos Concorrentes |
|---|---|---|
| Tráfego de API | Criptografado (XChaCha20) em HTTP e HTTPS | JSON em texto puro via HTTP |
| Tráfego WebSocket | Frames binários criptografados (XChaCha20) | JSON em texto puro ou sem WebSocket |
| Manuseio do token de autenticação | Usado como chave de criptografia, nunca em cabeçalhos | Enviado em cabeçalhos HTTP (fácil de vazar) |
| URLs de arquivos | IDs de caminho criptografados | Caminhos em texto puro expostos |
| Troca de chaves | ECDH (P-256) | Nenhuma |
| Assinatura de requisições | Ed25519 (apenas dispositivo a dispositivo) | Nenhuma |
| Proteção contra replay | 30 s + nonce (Web); 5 min + assinatura (dispositivo) | Nenhuma |
| Proteção de login | Limite de tentativas + confirmação de dois fatores | Tentativas ilimitadas |
| Roteamento de dados | 100% local, sem nuvem | Alguns roteiam pela nuvem |
| Dependências | Mínimas, bibliotecas reconhecidas | Centenas de pacotes npm |
| Código-fonte | Open source (GPL-3.0) | Majoritariamente fechado |
A maneira mais fácil de verificar qualquer aplicativo: abra o Chrome DevTools (F12) → aba Network enquanto usa o app. Se você consegue ler as respostas da API como JSON, o aplicativo não tem criptografia.
Verifique Você Mesmo
O PlainApp é totalmente open source. Cada afirmação neste artigo pode ser verificada no código.
github.com/plainhub/plain-app (GPL-3.0)Pipeline de release automatizado, rastreável e resistente a adulteração
Todos os pacotes de instalação são compilados automaticamente pela infraestrutura do GitHub e do F-Droid. Os builds são rastreáveis, seguros e sem intervenção manual. O PlainApp está entre os poucos apps Android que oferecem builds verificáveis (SLSA) e releases escaneados pelo VirusTotal.
Builds automatizados no GitHub e no F-Droid
Os artefatos de release são gerados por pipelines de CI em vez de empacotamento manual local. Cada artefato pode ser rastreado até commits de código-fonte e workflows reproduzíveis.
SLSA Provenance (Nível 3) + varredura VirusTotal
Cada release inclui atestações de proveniência SLSA e resultados de varredura do VirusTotal, tornando a cadeia de suprimentos auditável e ajudando os usuários a verificar a integridade antes da instalação.
Perguntas frequentes
O PlainApp é realmente criptografado se eu usar o modo HTTP?
Sim. Todas as chamadas de API (SMS, contatos, lista de arquivos, etc.) são criptografadas com XChaCha20-Poly1305 em ambos os modos HTTP e HTTPS. O modo HTTP deixa apenas downloads de arquivos sem criptografia. Para proteção completa, use HTTPS.
Por que meu navegador mostra um aviso de segurança?
O PlainApp usa um certificado TLS autoassinado para criptografia. Como ele não é emitido por uma Autoridade Certificadora pública, seu navegador exibe um aviso. Isso é normal e esperado para um aplicativo de rede local. Clique em 'Avançado' e 'Continuar' para prosseguir.
Alguém na mesma rede Wi-Fi pode ver meus dados?
Com o PlainApp, não. As chamadas de API são criptografadas com XChaCha20-Poly1305, e no modo HTTPS as transferências de arquivos também são criptografadas por TLS. Com a maioria dos aplicativos concorrentes, sim — suas chamadas de API são enviadas como texto puro em JSON.
Como o PlainApp se compara a uma VPN?
Uma VPN criptografa o tráfego entre seu dispositivo e o servidor VPN. O PlainApp criptografa o tráfego entre seu celular e o navegador na rede local. Eles servem propósitos diferentes — o PlainApp protege o gerenciamento local do dispositivo, enquanto uma VPN protege o tráfego na internet.
O código é realmente open source?
Sim. O PlainApp é licenciado sob GPL-3.0. O código-fonte completo está disponível em github.com/plainhub/plain-app. Você pode inspecionar cada implementação de criptografia, compilar a partir do código-fonte ou contribuir.
Retome o controle do seu telefone.
Nenhum intermediário na nuvem. Sem taxas mensais. Apenas seu telefone e seu navegador.