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.

Security Architecture Comparison
1

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)
2

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:

  1. 1Seu navegador constrói uma requisição (por exemplo, "mostre meus SMS")
  2. 2Adiciona um timestamp e um nonce aleatório para proteção contra replay
  3. 3Criptografa todo o payload em dados binários ilegíveis com XChaCha20-Poly1305
  4. 4O binário criptografado é enviado pela rede — sem base64, sem JSON, binário puro
  5. 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.

Encrypted API Flow

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)
3

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.

4

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:

  1. 1Cada dispositivo gera um par de chaves (pública + privada)
  2. 2Eles trocam apenas suas chaves públicas
  3. 3Cada dispositivo combina sua chave privada com a chave pública do outro
  4. 4Ambos chegam ao mesmo segredo compartilhado — sem que ele jamais trafegue pela rede
ECDH Pairing Flow
5

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.jpg

Qualquer 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.

URL Encryption Comparison
6

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.

7

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 HTTPModo HTTPS
URLs de caminhos de arquivosCriptografado (XChaCha20)Criptografado (XChaCha20)
Chamadas de APICriptografado (XChaCha20)Criptografado (XChaCha20 + TLS)
Download de arquivosNão criptografado em trânsitoCriptografado por TLS
Para quem é indicadoIniciantes (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.

8

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:

FuncionalidadeApp TípicoPlainApp
Sons de notificaçãohowler.js / tone.jsSintetizador Web Audio API customizado
Geração de UUIDpacote npm uuidImplementação RFC 4122 escrita à mão
Upload de arquivosuppy / axiosUpload chunked customizado com fila
Vídeo WebRTCTwilio / Daily.co SDKCódigo PeerConnection escrito à mão
Cliente HTTPaxios / kyfetch 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çaPlainAppComum nos Concorrentes
Tráfego de APICriptografado (XChaCha20) em HTTP e HTTPSJSON em texto puro via HTTP
Tráfego WebSocketFrames binários criptografados (XChaCha20)JSON em texto puro ou sem WebSocket
Manuseio do token de autenticaçãoUsado como chave de criptografia, nunca em cabeçalhosEnviado em cabeçalhos HTTP (fácil de vazar)
URLs de arquivosIDs de caminho criptografadosCaminhos em texto puro expostos
Troca de chavesECDH (P-256)Nenhuma
Assinatura de requisiçõesEd25519 (apenas dispositivo a dispositivo)Nenhuma
Proteção contra replay30 s + nonce (Web); 5 min + assinatura (dispositivo)Nenhuma
Proteção de loginLimite de tentativas + confirmação de dois fatoresTentativas ilimitadas
Roteamento de dados100% local, sem nuvemAlguns roteiam pela nuvem
DependênciasMínimas, bibliotecas reconhecidasCentenas de pacotes npm
Código-fonteOpen 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)
Integridade de versão verificável

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.