Estava assistindo umas coisas um dia desses e em um certo momento um pessoal precisou criar um chat com criptografia de ponta a ponta (e2ee). Já trabalhei com criptografia simples, além de usar sempre as chaves públicas e privadas no linux, github, ssh etc.

Gerei essa estrutura com base no que foi falado

Resolvi pensar em como seria arquiteturar um sistema bem simples com esse tipo de funcionalidade. Não sei se já percebeu, mas o whatsapp tem essa funcionalidade. De uns anos pra cá os chats vêm com uma mensagem: "As mensagens nesse chat são criptografadas de ponta a ponta. Somente as pessoas nesse chat poderão visualizar o conteúdo."

O que é criptografia de ponta a ponta?

A criptografia de ponta a ponta, num contexto de chat, é quando cada usuário registrado no sistema recebe duas chaves, uma pública e uma privada. Essas chaves, falando entre muitas aspas, são sequências geradas por algoritmos de criptografia. Essas chaves ficam salvas somente na máquina desse usuário, não vão para o servidor (por segurança e para manter a confiabilidade do sistema de criptografia). Imagine que dois usuários estão prestes a se comunicar, internamente as chaves públicas são compartilhadas entre eles. E a partir dai ao enviar uma nova mensagem, essa mensagem é criptografada ("trancada") usando a chave pública do usuário 2. A mensagem é enviada por todo o sistema, salvo em banco etc, e assim que chega na máquina do segundo usuário, a mensagem é descriptografada ("destrancada") usando a chave privada.

Caminho da mensagem no sistema

Como eu acho que poderia ser a arquitetura desse sistema

Tenho estudado e tentado entender como funcionam as arquiteturas dos sistemas e como gerar arquiteturas cada vez melhores nos projetos que atuo. Pensando nisso pensei na seguinte coisa para esse projeto:

Imagem com a arquitetura proposta abaixo

Na minha visão faria um sistema utilizando nestjs, vue, redis, socket e mongodb.

  • O mecanismo de criptografia seria uma lib interna que proveria as funções relacionadas a criptografia: gerar chaves, criptografar mensagem, descriptografar mensagem, tudo com testes etc.

  • O frontend onde haveria login, cadastro, visualização dos chats, disparos etc. Trataria de salvar as chaves localmente, e integrações com backend via api + socket.

  • O Backend lidaria com o banco de dados, cache, disparar mensagens para as filas, banco etc.

  • O infra lidaria com a geração dos builds do frontend, backend etc.


E você, já pensou em como estruturaria um sistema assim? Estou estudando mais sobre arquitetura de software e adoraria trocar ideias.