Comunicação Privada com Go e Flutter: Construindo um Mensageiro P2P Seguro
Este artigo detalha a criação de um mensageiro descentralizado e seguro utilizando Go e Flutter. Ele explora a implementação de criptografia end-to-end, incluindo Double Ratchet para chats individuais e Messaging Layer Security (MLS) para grupos, além de abordar a arquitetura P2P com libp2p e notificações push.
MundiX News·01 de maio de 2026·10 min de leitura·👁 1 views
Recentemente, surgiu a necessidade de um mensageiro que atendesse a certos requisitos: ausência de um servidor central, criptografia end-to-end para garantir a privacidade das mensagens, a capacidade de qualquer pessoa configurar seu próprio servidor de forma fácil e rápida, e um único stack de rede para simplificar o processo. A biblioteca libp2p em Go, que suporta múltiplos transportes e autenticação de pares, oferece uma base sólida para redes P2P descentralizadas, tornando-a uma candidata ideal para integrar em um aplicativo móvel como transporte para chamadas e mensagens. Este artigo compartilha os resultados dessa tentativa.
O stack tecnológico empregado consiste em Flutter para a interface do usuário (UI). A lógica de rede reside em um binário compilado em .dylib (macOS), .so (Android/Linux) ou uma biblioteca estática (iOS). A comunicação entre Dart e Go é realizada através da FFI (Foreign Function Interface), que permite chamadas diretas de funções C. A conexão entre os pares pode ser estabelecida de duas maneiras: diretamente ou através de um nó intermediário, o Circuit Relay v2, que é essencial para contornar as restrições de NAT e firewalls, quando a conexão direta não é possível. A principal questão no início do desenvolvimento foi como chamar o código Go a partir do aplicativo Flutter. A solução mais eficaz foi através do CGO. Go pode ser compilado em uma shared library compatível com C, com funções exportadas.
Para a compilação, no Android, o processo envolve o uso de CGO_ENABLED, a definição de GOOS e GOARCH, e a especificação do compilador CC. O resultado é um arquivo .so que deve ser colocado em jniLibs/arm64-v8a/ para ser automaticamente reconhecido pelo Flutter. No iOS, a compilação gera um arquivo .a e um .h, que são linkados estaticamente no projeto Xcode. Para bibliotecas universais (device + simulator), são gerados dois arquivos .a (arm64 e x86_64) e combinados usando lipo -create. A ponte FFI, que conecta Go e Dart, requer que as funções Go a serem chamadas do Dart sejam marcadas com //export. A função main() é obrigatória, mesmo que vazia. No lado Dart, a biblioteca é carregada dinamicamente, e as funções Go são chamadas usando lookupFunction. A função StartNode, por exemplo, é usada para iniciar a rede P2P, e SendMessage é usada para enviar mensagens. A libp2p é configurada com os transportes e protocolos necessários, usando um PeerID único para cada dispositivo, que é um hash da chave pública Ed25519. As mensagens são enviadas diretamente se o par estiver online; caso contrário, são criptografadas e armazenadas em um nó servidor até a entrega. Para chamadas P2P, é usado um sistema de transporte de três camadas, que garante baixa latência, mesmo com NATs restritivos. A comunicação de áudio é gerenciada por meio de pacotes Opus, e, para lidar com dispositivos offline, são utilizadas notificações push (APNs para iOS, FCM para Android), que servem apenas para despertar o dispositivo, garantindo que o conteúdo da mensagem permaneça criptografado e privado.
A segurança é fundamental em qualquer mensageiro moderno. O projeto implementa criptografia End-to-End (E2EE) com Perfect Forward Secrecy (PFS) e Post-Compromise Security (PCS). Para conversas privadas, é utilizado o algoritmo Double Ratchet, que inclui inicialização (X3DH), Symmetric Ratchet e DH Ratchet. Para grupos, é utilizado o Messaging Layer Security (MLS), que constrói uma árvore de chaves binárias, permitindo que grupos com centenas de pessoas sejam criptografados com a mesma segurança e velocidade que chats individuais. O projeto está em desenvolvimento, com planos para federação de nós servidores, modo P2P completo e chamadas em grupo. O aplicativo está disponível na App Store e, em breve, no Google Play.
🛡️⚡
Pare de pesquisar. Comece a hackear.
O MundiX é seu copiloto de pentest com IA: comandos exatos, análise de outputs e próximo passo na kill chain — em segundos.
Sem cartão para começar · Planos a partir de R$49/mês
Recentemente, surgiu a necessidade de um mensageiro que atendesse a certos requisitos: ausência de um servidor central, criptografia end-to-end para garantir a privacidade das mensagens, a capacidade de qualquer pessoa configurar seu próprio servidor de forma fácil e rápida, e um único stack de rede para simplificar o processo. A biblioteca libp2p em Go, que suporta múltiplos transportes e autenticação de pares, oferece uma base sólida para redes P2P descentralizadas, tornando-a uma candidata ideal para integrar em um aplicativo móvel como transporte para chamadas e mensagens. Este artigo compartilha os resultados dessa tentativa.
O stack tecnológico empregado consiste em Flutter para a interface do usuário (UI). A lógica de rede reside em um binário compilado em .dylib (macOS), .so (Android/Linux) ou uma biblioteca estática (iOS). A comunicação entre Dart e Go é realizada através da FFI (Foreign Function Interface), que permite chamadas diretas de funções C. A conexão entre os pares pode ser estabelecida de duas maneiras: diretamente ou através de um nó intermediário, o Circuit Relay v2, que é essencial para contornar as restrições de NAT e firewalls, quando a conexão direta não é possível. A principal questão no início do desenvolvimento foi como chamar o código Go a partir do aplicativo Flutter. A solução mais eficaz foi através do CGO. Go pode ser compilado em uma shared library compatível com C, com funções exportadas.
Para a compilação, no Android, o processo envolve o uso de CGO_ENABLED, a definição de GOOS e GOARCH, e a especificação do compilador CC. O resultado é um arquivo .so que deve ser colocado em jniLibs/arm64-v8a/ para ser automaticamente reconhecido pelo Flutter. No iOS, a compilação gera um arquivo .a e um .h, que são linkados estaticamente no projeto Xcode. Para bibliotecas universais (device + simulator), são gerados dois arquivos .a (arm64 e x86_64) e combinados usando lipo -create. A ponte FFI, que conecta Go e Dart, requer que as funções Go a serem chamadas do Dart sejam marcadas com //export. A função main() é obrigatória, mesmo que vazia. No lado Dart, a biblioteca é carregada dinamicamente, e as funções Go são chamadas usando lookupFunction. A função StartNode, por exemplo, é usada para iniciar a rede P2P, e SendMessage é usada para enviar mensagens. A libp2p é configurada com os transportes e protocolos necessários, usando um PeerID único para cada dispositivo, que é um hash da chave pública Ed25519. As mensagens são enviadas diretamente se o par estiver online; caso contrário, são criptografadas e armazenadas em um nó servidor até a entrega. Para chamadas P2P, é usado um sistema de transporte de três camadas, que garante baixa latência, mesmo com NATs restritivos. A comunicação de áudio é gerenciada por meio de pacotes Opus, e, para lidar com dispositivos offline, são utilizadas notificações push (APNs para iOS, FCM para Android), que servem apenas para despertar o dispositivo, garantindo que o conteúdo da mensagem permaneça criptografado e privado.
A segurança é fundamental em qualquer mensageiro moderno. O projeto implementa criptografia End-to-End (E2EE) com Perfect Forward Secrecy (PFS) e Post-Compromise Security (PCS). Para conversas privadas, é utilizado o algoritmo Double Ratchet, que inclui inicialização (X3DH), Symmetric Ratchet e DH Ratchet. Para grupos, é utilizado o Messaging Layer Security (MLS), que constrói uma árvore de chaves binárias, permitindo que grupos com centenas de pessoas sejam criptografados com a mesma segurança e velocidade que chats individuais. O projeto está em desenvolvimento, com planos para federação de nós servidores, modo P2P completo e chamadas em grupo. O aplicativo está disponível na App Store e, em breve, no Google Play.
📤 Compartilhar & Baixar
📩 Newsletter MundiX
Receba novidades de cibersegurança + um checklist de pentest grátis. Sem spam.
Ao assinar você concorda em receber e-mails. Cancele quando quiser.