JavaScript - Perguntas sobre criptografia ponta-a-ponta

Tenho algumas dúvidas sobre criptografia ponta-a-ponta. Dúvidas nível leigo. Se alguém souber responder ao menos uma pergunta, ficarei feliz.

  • Criptografia ponta-a-ponta trata-se de criptografia no cliente e servidor (e somente isso)? Ou há mais alguma coisa por de trás dos panos?
  • Existe alguma lib confiável de criptografia para NodeJS?
  • TypeScript pode ser uma alternativa superior ao JavaScript quando o assunto é criptografia (por garantir tipagem)?
  • Uma aplicação peer-to-peer precisa de mais atenção em segurança no lado do cliente, ou do servidor (para atividades simples, como gerenciar chaves de criptografia, boot da aplicação, etc)?

A expressão “ponta a ponta” tem significado no contexto da arquitetura de aplicações que usam algum tipo de “roteador” no meio do caminho.

Considere uma aplicação de mensagem como o Whatsapp. Quando o usuário U1 envia uma mensagem pra outro usuário U2, a UX leva a crer que a relação tem essa aparência.

U1 <--> U2

Porém, logo abaixo desta UX, existe uma realidade onde um serviço intermediário S recebe mensagens de U1 e encaminha para o destinatário.

U1 <--> S <--> U2

Então, veja bem. Mesmo que os dois links no diagrama acima sejam assegurados por TLS ou similar, na passagem por dentro de S, a sua mensagem existe sem sigilo. Afinal, ela foi decifrada na recepção de U1 para posteriormente ser recifrada no encaminhamento a U2. Ou seja, existe um tempo durante o qual a mensagem está em claro na memória de S.

Portanto, aplicar TLS ou equivalente em cada um dois links individualmente não é suficiente para assegurar o usuário U1 que a sua mensagem foi enviada com sigilo de ponta a ponta para o usuário U2.

Para assegurar isto, a mensagem deve sair cifrada de U1 e somente ser decifrada em U2. Isto é o que sigilo de ponta a ponta significa.