JustDropFile

Como funciona

O JustDropFile é uma transferência de arquivos ponto a ponto que roda inteiramente no navegador. Esta página explica cada etapa sem rodeios, para que você decida por conta própria se confia nela.

1

Você solta um arquivo e recebe um link

Seu navegador gera dois valores aleatórios: um ID de sessão de 128 bits e uma chave de criptografia de 256 bits. Com eles, monta um link como justdropfile.com/r/#sessao.chave. Toda a identidade da transferência fica depois do sinal #, o chamado fragmento, e os navegadores nunca enviam o fragmento a servidor nenhum. Neste ponto nada saiu do seu dispositivo além de uma conexão WebSocket com o nosso serviço de sinalização carregando o ID de sessão.

  • •O código QR é o mesmo link, desenhado localmente.
  • •O link vale por 20 minutos se ninguém abrir; depois a sessão é destruída.
2

A outra pessoa abre o link, e os navegadores se encontram

O navegador receptor lê o fragmento, conecta-se ao serviço de sinalização com o mesmo ID de sessão, e os dois navegadores trocam descritores de conexão (SDP e candidatos ICE) por meio dele. Esse é o único trabalho do servidor: passar alguns kilobytes de handshake entre exatamente dois pares. Ele recusa um terceiro, não registra os descritores e apaga a sessão no instante em que os pares se conectam.

Technical note:

O serviço de sinalização é um Cloudflare Worker com um Durable Object por sessão. A criação de sessões tem limite de taxa por IP. Só contadores agregados são registrados, nunca o conteúdo dos descritores.

3

Uma conexão direta é tentada primeiro

O WebRTC tenta três rotas em ordem: um caminho direto pela rede local, um caminho direto pela internet usando STUN para descobrir os endereços públicos, e por último um relay. A maioria das redes domésticas e móveis permite uma das duas primeiras. A conexão em si é criptografada com DTLS, como o WebRTC exige.

  • •Conexões diretas não têm limite de tamanho.
  • •Depois de conectar, a página verifica qual rota foi escolhida e mostra "direta" ou "por relay".
4

Se a direta falhar, um relay criptografado assume

Algumas redes de escritório, hospital, campus e hotel bloqueiam completamente conexões diretas entre pares. Quando isso acontece, o tráfego é retransmitido pelo Cloudflare TURN. O relay encaminha texto cifrado; ele não tem a chave. As credenciais de relay são geradas por sessão pelo nosso worker e expiram, então o relay não pode ser aproveitado como proxy gratuito. Transferências por relay têm limite de 2 GB porque bytes por relay custam dinheiro.

Technical note:

O Cloudflare TURN é usado com credenciais de curta duração geradas por sessão. Se até o relay estiver bloqueado, a página avisa e sugere outra rede ou o roteador do celular.

5

O receptor vê a lista de arquivos e aceita

Antes de qualquer byte de arquivo se mover, o remetente transmite um manifesto criptografado: nomes, tamanhos e tipos de arquivo. Ele passa pela conexão entre pares, não pela sinalização, então o nosso servidor nunca o vê. O receptor pode recusar. Ao aceitar, o navegador receptor abre um lugar para gravar o arquivo: uma pasta que você escolhe (Chrome e Edge no desktop) ou o armazenamento privado em disco do navegador (Safari, Firefox, Android), de modo que o arquivo é gravado no disco conforme chega, em vez de ficar na memória.

6

Os arquivos atravessam em pedaços criptografados

O remetente lê o arquivo em fatias de até 64 KB, criptografa cada fatia com AES-GCM usando a chave do link e a envia por um canal de dados WebRTC. Cada pedaço carrega o número do arquivo e a posição como dados autenticados, então um pedaço corrompido, faltando, fora de ordem ou repetido falha na verificação. No fim de cada arquivo o remetente envia uma contagem e um total de bytes assinados; o receptor confirma os dois antes de dar o aceite. Os arquivos são enviados um após o outro por uma única conexão.

  • •Nenhum dos lados jamais mantém um arquivo inteiro na memória. Transferências de vários gigabytes funcionam em celulares.
  • •O remetente respeita a contrapressão do canal, então um receptor lento desacelera o remetente em vez de encher a memória dele.
  • •Se a conexão cair, a transferência falha de forma clara e o remetente pode criar um novo link. Não há retomada nesta versão.

Confira você mesmo

Abra as ferramentas de desenvolvedor do navegador, vá até a aba Rede e faça uma transferência. Você verá um WebSocket para o host de sinalização carregando pequenas mensagens JSON, e nada mais: nenhuma requisição de upload, nenhum byte de arquivo. A transferência em si aparece nos internos do WebRTC (chrome://webrtc-internals no Chrome), onde você também pode confirmar se o par de candidatos escolhido é direto ou por relay.

A chave nunca aparece em nenhuma requisição porque está no fragmento da URL. Você pode confirmar isso na mesma aba Rede: a requisição para o host de sinalização contém o ID de sessão e nada depois do ponto.

O que este design não consegue fazer

  • •Não consegue entregar para alguém que está offline. Não há armazenamento, então os dois lados precisam estar presentes.
  • •Não consegue esconder seu endereço IP do outro participante. Conexões entre pares funcionam trocando endereços.
  • •Não consegue atravessar uma rede que bloqueia tanto conexões diretas quanto relays TURN.
  • •Não consegue retomar uma transferência interrompida. Você recomeça com um novo link.