Porque é que a chave fica na ligação
O sinal # numa ligação Sésame Éclair separa o que o nosso servidor recebe daquilo que ele nunca vê. Eis como.
Uma ligação Sésame Éclair tem este aspeto:
https://eclair.kayzen-lyon.com/s/Q2xhaXJlTGFQb2ludGU#v1.n.k7X…
Tudo o que está antes do sinal # serve para encontrar o segredo. Tudo o que vem depois é a chave necessária para o ler. Esta separação não é uma convenção nossa: faz parte do funcionamento da Web.
O que o navegador nunca envia
A parte de um endereço que se segue ao # chama-se fragmento. A norma dos endereços Web (RFC 3986) mantém-no no navegador: nunca é enviado ao servidor no pedido. Quando o destinatário abre a ligação, o nosso servidor recebe o identificador do segredo, mas não a chave.
O navegador do destinatário lê a chave no fragmento, transfere o bloco cifrado e decifra-o localmente.
O que recebemos quando cria um segredo
Quando cria um segredo, o seu navegador:
- gera uma chave aleatória de 256 bits;
- cifra o conteúdo com AES-256-GCM, depois de o preencher até um tamanho padrão para não revelar o seu comprimento;
- envia-nos apenas o resultado cifrado, a expiração escolhida e o número de leituras autorizadas;
- coloca a chave no fragmento da ligação que lhe apresenta.
Guardamos, portanto, um bloco ilegível. Mesmo com acesso total à nossa base de dados, o conteúdo não pode ser recuperado sem a ligação.
E o PIN?
O PIN acrescenta uma segunda chave, derivada do código com Argon2id, uma função deliberadamente lenta que torna as tentativas dispendiosas. O servidor recebe apenas um verificador que não permite reconstituir o código. Após cinco tentativas erradas, o segredo é destruído.
Os limites, com franqueza
- A ligação é o segredo. Quem a obtiver antes do destinatário pode lê-la. O destinatário saberá, no entanto: verá que a ligação já foi utilizada, e o aviso de leitura informá-lo-á a si. Para credenciais sensíveis, acrescente um PIN e envie-o por outro canal.
- O fragmento fica no histórico do navegador do destinatário. O segredo não está lá, e a ligação deixa de funcionar após a leitura.
- A cifragem acontece na página que servimos. A política de segurança do site proíbe qualquer script de terceiros, e o formato está documentado publicamente, com os seus vetores de teste.
Pode ver exatamente o que o nosso servidor recebe na página «O que o servidor vê».