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