Como funciona

Chat peer-to-peer com WebRTC, explicado

Depois do handshake não existe servidor no caminho, então não há nada para guardar nem para entregar. Veja exatamente o que o backend enxerga, e as três coisas que o peer-to-peer não garante.

Abrir sala P2P

O único trabalho do servidor é a apresentação

Todo app de chat que você já usou funciona do mesmo jeito por baixo dos panos: sua mensagem sobe até o servidor de uma empresa, o servidor guarda ela, e o servidor entrega para a outra pessoa. As discussões sobre criptografia são sobre quem pode ler essa cópia. A cópia continua existindo.

Um DataChannel do WebRTC pula essa etapa do meio. Dois navegadores negociam uma conexão direta criptografada, e depois que ela abre, sua mensagem vai da sua máquina para a do outro sem nada no caminho. O FadeChats até roda um servidor, mas ele funciona como uma telefonista de mesa: passa os dados que os dois navegadores precisam para se encontrar, e depois sai da conversa.

Esse é todo o truque, e é por isso que este site não tem um botão de "apagar meus dados". Não existe uma tabela de mensagens para apagar.

Duas pessoas paradas embaixo de um poste de luz conversando em uma esquina à noite
A sinalização é alguém apontando vocês um para o outro. Depois disso, são só vocês dois.Pexels · .M.Q Huang

O que acontece entre abrir a página e digitar

  1. Seu navegador escreve uma oferta

    Ele monta uma oferta SDP descrevendo o transporte que suporta, mais a impressão digital de um certificado gerado para esta sessão. A oferta vai para o servidor do FadeChats, estacionada sob um id de sala aleatório.

  2. O outro navegador responde

    Seu convidado abre o link de convite de uso único, pega a oferta e devolve uma resposta. Os dois lados também trocam candidatos ICE: os endereços de rede em que cada um pode estar acessível, descobertos com a ajuda de um servidor STUN.

  3. As duas pontas apertam as mãos direto

    O ICE testa pares de candidatos até um conectar, e então os navegadores fazem um handshake DTLS sobre essa conexão. Eles mesmos derivam as chaves e conferem um ao outro contra as impressões digitais combinadas no primeiro passo.

  4. O canal abre, o servidor termina seu papel

    Texto, imagens, GIFs e figurinhas viajam em um fluxo SCTP dentro dessa sessão DTLS, de navegador para navegador. Os registros de configuração expiram em um TTL de 10 minutos que a atividade renova.

Quem consegue ver o quê

A pessoa que você convidouO servidor do FadeChatsUm relay TURN, quando necessário
Mensagens, imagens, GIFsSim, essa é a ideiaNuncaSó bytes criptografados
O id da salaSimSimSim
Seu endereço IPSim, numa conexão diretaSim, durante a configuraçãoSim, enquanto faz o relay
Que a sala esteve ativaSimAté o TTL expirarEnquanto faz o relay
Qualquer coisa depois que a sala desapareceSó o que a pessoa capturouNada foi escrito, nuncaNada

Cada lado descobrir o endereço do outro é uma propriedade do transporte, não uma configuração que dá para desligar.

Uma pessoa digitando em um notebook perto de uma janela à noite, o rosto iluminado pela tela
Uma linha direta funciona nos dois sentidos: a pessoa que você convidou consegue ver de onde vêm seus pacotes.Pexels · VAZHNIK

Três coisas que o peer-to-peer não garante

  • Seu par vê seu endereço IP

    Uma conexão direta tem duas pontas reais, então a pessoa que você convidou descobre mais ou menos sua cidade e seu provedor de internet. O Signal esconde isso fazendo o relay de tudo pelos próprios servidores. O FadeChats não pode, porque fazer o relay de tudo é justamente o que ele se recusa a fazer.

  • Às vezes existe um relay de qualquer jeito

    NAT simétrico, redes corporativas e algumas operadoras de celular bloqueiam um caminho direto. Aí o WebRTC recorre a um relay TURN, que repassa bytes criptografados por DTLS sem ter a chave para eles. Ainda assim é uma terceira máquina no caminho, e vale dizer isso em voz alta.

  • O handshake confia no canal de sinalização

    Cada lado verifica a impressão digital do certificado do outro, mas essa impressão digital chegou através do servidor. Um servidor de sinalização comprometido poderia, em princípio, trocá-la e ficar no meio. O Signal resolve isso com números de segurança que você compara por fora; o FadeChats não tem essa verificação.

Onde esse formato encaixa

Peer-to-peer é certo quando duas pessoas precisam dizer algo uma vez e não querem nenhuma cópia disso em lugar nenhum: uma senha com uma pergunta de acompanhamento, um endereço, um diagnóstico, um número. É o formato errado para um grupo, para qualquer coisa que precise sobreviver a uma aba fechada, e para uma situação em que errar sobre quem é o adversário tem consequências reais.

Perguntas frequentes

Um chat com WebRTC precisa de servidor?

Precisa, mas só para apresentar os dois navegadores. Um servidor de sinalização carrega a oferta, a resposta e os candidatos de rede; um servidor STUN diz a cada navegador qual é o seu endereço público. Depois que o DataChannel abre, nenhum dos dois fica no caminho de uma única mensagem.

O servidor de sinalização consegue ler minhas mensagens?

Não, ele nunca recebe elas. O canal é negociado entre os navegadores e as chaves são deles. O servidor do FadeChats guarda só os registros de configuração, que expiram em um TTL de 10 minutos renovado pela atividade.

A outra pessoa vê meu endereço IP?

Numa conexão direta, sim, e você também vê o dela. É isso que torna a conexão direta. Se você precisa esconder isso da pessoa com quem está falando, use uma VPN, ou use uma ferramenta que faz o relay de tudo, como o Signal.

Um DataChannel do WebRTC é criptografado de ponta a ponta?

O transporte é: SCTP dentro de DTLS, com chaves que os dois navegadores derivam sozinhos. A ressalva é a troca de impressões digitais explicada acima. A criptografia de ponta a ponta no WebRTC só é tão confiável quanto o canal que carregou essas impressões digitais.

Preciso instalar alguma coisa para experimentar?

Não. O WebRTC já vem em todo navegador atual, então o FadeChats é só uma página que você abre. Sem conta, sem número de telefone, sem aplicativo. A sala existe assim que a página carrega e cabem duas pessoas nela.