Ferramenta gratuita de privacidade

Selar um ficheiro

Encripte um ficheiro com uma chave de uso único acabada de gerar e envie-o pelo canal que quiser. Quem tiver a chave abre-o aqui mesmo, nesta página. Nada é alguma vez enviado, não há frase-passe nenhuma para quebrar, e vê o que está lá dentro antes de se guardar seja o que for.

Corre inteiramente neste separador. Esta página não consegue falar com nenhum servidor.

Todos os parâmetros, declarados

Cifra
AES-256-GCM (WebCrypto), etiqueta de 128 bits por bloco
Chave
256 bits vindos do CSPRNG do navegador, gerada de novo em cada selagem, usada uma só vez, não derivada de nada
Divisão em blocos
um manifesto encriptado (nome, tamanho e tipo do ficheiro) e depois o ficheiro em blocos de 1 MiB — cada um autenticado em separado
Nonce
sal de selagem aleatório de 32 bits ‖ contador de blocos de 64 bits — nunca repetido dentro de um ficheiro e, de qualquer forma, a chave é de uso único
Dados autenticados
todo o cabeçalho de 16 bytes mais o índice de cada bloco e o número total de blocos — reordenar, truncar ou enxertar blocos quebra a desencriptação
Cadeia da chave
base64url, 47 caracteres: a chave de 32 bytes mais uma soma de verificação SHA-256 de 3 bytes, para que uma gralha falhe de forma limpa em vez de produzir lixo

Respostas honestas sobre o que isto faz

Tudo acontece no seu navegador.

Selar e abrir leem ambos o ficheiro para a memória desta página, executam aí AES-256-GCM com o motor WebCrypto integrado no seu navegador e devolvem-lhe o resultado como um descarregamento. Nada é enviado. Não há conta nem processamento do lado do servidor. Ao contrário do resto deste site, esta página nem sequer carrega o contador de visitas sem cookies. Nenhuma telemetria, de espécie nenhuma.

Isto não é só uma promessa. A página é servida com uma Content-Security-Policy que só permite ao navegador ir buscar os ficheiros estáticos deste próprio site. Não tem forma nenhuma de enviar o seu ficheiro, a sua chave ou o que quer que seja para servidor nenhum, incluindo o nosso. Abra as ferramentas de programador do seu navegador enquanto sela e verá zero pedidos. Para a prova mais contundente, instale a Caixa de Ferramentas e sele em modo de voo. Com a rede desligada, nada pode sair.

A chave é tudo — e nós nunca a temos.

Cada selagem gera no seu navegador uma chave aleatória nova de 256 bits. É-lhe mostrada uma única vez e não fica guardada em lado nenhum: nem nos nossos sistemas (não há nenhum envolvido), nem no armazenamento do seu navegador, nem no ficheiro selado. Não há frase-passe nenhuma para adivinhar nem nada a que aplicar força bruta. Quem tiver a chave e o ficheiro consegue abri-lo. Quem não tiver, não consegue.

Isso tem uma consequência dura: se a chave se perder, o ficheiro perde-se. Não há reposição, não há pedido de suporte, não há recuperação. Não é falta de vontade de ajudar. Uma cópia que nós conseguíssemos recuperar seria uma cópia que alguém poderia roubar ou exigir.

A ligação com a chave nunca chega a um servidor.

A ligação de partilha coloca a chave depois do # do URL. Essa parte, o fragmento, fica com o navegador. Nunca é incluída no que o navegador envia para servidor nenhum, nosso ou de quem quer que seja. Quando esta página abre com uma chave na ligação, lê a chave, muda para o separador Abrir e remove imediatamente a chave da barra de endereço. Assim, não fica no URL visível nem no histórico do navegador.

Ainda assim, quem tiver ao mesmo tempo a ligação e o ficheiro selado consegue abri-lo. É por isso que esta página lhe diz para enviar o ficheiro e a chave por canais diferentes.

Vê o que está lá dentro antes de se guardar seja o que for.

Abrir acontece em dois passos. Primeiro, a página desencripta apenas um pequeno manifesto: o nome original, o tamanho e o tipo do ficheiro. Mostra-lho, com um aviso bem visível para os tipos de ficheiro que podem executar código (programas, scripts, instaladores, documentos com macros, HTML) e para nomes disfarçados com uma extensão dupla, como invoice.pdf.exe. Nada é escrito até clicar para desencriptar. A própria página nunca abre nem apresenta o conteúdo desencriptado. Limita-se a disponibilizar o ficheiro para descarregar.

Tenha bem presente o que a encriptação prova e o que não prova. Um ficheiro selado é confidencial em trânsito. Selá-lo não diz nada sobre quem o enviou nem sobre se o conteúdo é seguro. Trate um ficheiro selado inesperado com o mesmo ceticismo com que trataria um anexo inesperado.

Onde está realmente a fronteira de confiança.

Está a executar código que este site lhe serviu. Se o sealby.app ou a sua ligação a ele estivessem comprometidos, uma página maliciosa poderia ler o que lá colocasse. Isto é verdade para todas as ferramentas de encriptação baseadas na web, e preferimos dizê-lo a fingir o contrário. O que fazemos quanto a isso: a página é um ficheiro estático e mantemo-la livre de código de terceiros. A Caixa de Ferramentas instalada permite-lhe continuar a usar uma versão que já carregou. E o formato está documentado abaixo, para que se possam construir ferramentas independentes compatíveis com ele.

O seu próprio dispositivo também está dentro dessa fronteira. Extensões do navegador com acesso à página, ou malware na máquina, conseguem ler tudo aquilo que qualquer página consegue ler. O ficheiro selado esconde o seu conteúdo, mas não tudo. Quem o tiver consegue ver o seu tamanho (aproximadamente o do original) e que é um ficheiro selado pelo Sealby.

Os limites, em linguagem simples

  • Chave perdida = ficheiro perdido. Sem exceções, por conceção.
  • Não conseguimos ver os seus ficheiros nem as suas chaves, por isso também não os conseguimos analisar à procura de malware. O aviso sobre o tipo de ficheiro baseia-se apenas no nome do ficheiro. Não é uma garantia de segurança.
  • Quem tiver ao mesmo tempo o ficheiro selado e a chave consegue abri-lo. A ferramenta não sabe nem verifica quem é.
  • O tamanho do ficheiro selado revela aproximadamente o tamanho do ficheiro original.
  • Um ficheiro, até 100 MB, por selagem. Junte vários ficheiros num ZIP primeiro.

O formato, byte a byte

Tudo o que um leitor técnico precisa para verificar de forma independente o resultado desta página, ou para abrir um ficheiro .sealed em trinta linhas de Python:

bytesfieldcontents
0–7magicASCII "SEALBY-W"
8versão0x01 — qualquer outro valor é rejeitado como «feito com uma versão mais recente»
9algoritmo0x01 = AES-256-GCM
10–13sal de selagem4 bytes, CSPRNG, novo em cada selagem
14–15reservadotem de ser zero
16–fimtramas de blocoscada uma: comprimento do texto cifrado em uint32 BE, seguido do texto cifrado AES-GCM + etiqueta de 16 bytes

O bloco 0 é o manifesto: JSON em UTF-8 {"name":…,"size":…,"type":…}. Os blocos 1…N−1 são o ficheiro em pedaços de 1 MiB. Para o bloco i de N: nonce = sal ‖ uint64 BE i; dados autenticados = cabeçalho ‖ uint64 BE i ‖ uint64 BE N. Assim, adulteração, truncagem, reordenação, deslocação e enxerto entre ficheiros falham todos a autenticação. Cada caso é provado por um teste negativo incluído no repositório.

Cadeia da chave: base64url (sem preenchimento) da chave de 32 bytes seguida dos 3 primeiros bytes do respetivo SHA-256, 47 caracteres no total. Uma gralha faz falhar a soma de verificação em vez de produzir lixo.

Leitor de referência (Python, biblioteca cryptography)
import base64, hashlib, json, struct, sys
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SEALBY-W" and raw[8] == 1 and raw[9] == 1
assert raw[14:16] == b"\x00\x00"
header, salt = raw[:16], raw[10:14]
frames, off = [], 16
while off < len(raw):
    (n,) = struct.unpack(">I", raw[off:off + 4]); off += 4
    frames.append(raw[off:off + n]); off += n
assert off == len(raw)

kb = base64.urlsafe_b64decode(sys.argv[2] + "=")   # 47-char key string
key, check = kb[:32], kb[32:35]
assert hashlib.sha256(key).digest()[:3] == check    # typo check

N = len(frames)
def chunk(i):
    nonce = salt + struct.pack(">Q", i)
    aad = header + struct.pack(">QQ", i, N)
    return AESGCM(key).decrypt(nonce, frames[i], aad)

manifest = json.loads(chunk(0))
data = b"".join(chunk(i) for i in range(1, N))
assert len(data) == manifest["size"]
open(manifest["name"], "wb").write(data)
print("decrypted ->", manifest["name"])

Isto é para ficheiros em trânsito. O cofre é para ficheiros em repouso.

Selar protege um ficheiro a caminho de algum lado. O Sealby protege tudo o que fica: fotos, ficheiros e notas em cofres encriptados no seu iPhone. Sem conta, sem servidores, legíveis por ninguém a não ser você.

Descarregar na App Store

iPhone e iPad · iOS 17+ · Grátis