Gratis privacytool

Verzegel een bestand

Versleutel een bestand onder een verse eenmalige sleutel en stuur het via elk kanaal dat je wilt. Wie de sleutel heeft, opent het hier, op deze pagina. Er wordt nooit iets geüpload, er is geen wachtwoordzin om te kraken, en je ziet wat erin zit voordat er iets wordt bewaard.

Draait volledig in dit tabblad. Deze pagina kan met geen enkele server praten.

Elke parameter, uitgeschreven

Cipher
AES-256-GCM (WebCrypto), tag van 128 bits per chunk
Sleutel
256 bits uit de CSPRNG van de browser, vers gegenereerd per verzegeling, eenmalig gebruikt, nergens uit afgeleid
Opdeling in chunks
een versleuteld manifest (bestandsnaam, grootte, type), daarna het bestand in chunks van 1 MiB — elk afzonderlijk geauthenticeerd
Nonce
32-bits willekeurige verzegelsalt ‖ 64-bits chunkteller — binnen één bestand komt hij nooit terug, en de sleutel is toch al eenmalig
Geauthenticeerde data
de volledige header van 16 bytes plus de index van elke chunk en het totale aantal chunks — chunks herordenen, afkappen of aan elkaar plakken breekt het ontsleutelen
Sleutelreeks
base64url, 47 tekens: de sleutel van 32 bytes plus een SHA-256-checksum van 3 bytes, zodat een typefout netjes faalt in plaats van rommel op te leveren

Eerlijke antwoorden over wat dit doet

Alles gebeurt in je browser.

Zowel verzegelen als openen leest het bestand in het geheugen van deze pagina, draait daar AES-256-GCM met de ingebouwde WebCrypto-engine van je browser, en geeft het resultaat terug als download. Er wordt niets geüpload. Er is geen account en geen verwerking op een server. Anders dan de rest van deze site laadt deze pagina zelfs de cookieloze bezoekersteller niet. Geen enkele vorm van analytics.

Dat is niet zomaar een belofte. De pagina wordt geserveerd met een Content-Security-Policy die de browser alleen de eigen statische bestanden van deze site laat ophalen. Ze heeft geen enkele manier om je bestand, je sleutel of wat dan ook naar een server te sturen, ook niet naar de onze. Open de ontwikkelaarstools van je browser tijdens het verzegelen en je zult nul verzoeken zien. Voor het meest rechtstreekse bewijs installeer je de Toolbox en verzegel je in vliegtuigmodus. Met het netwerk uit kan er niets weg.

De sleutel is alles — en wij hebben hem nooit.

Elke verzegeling genereert een verse willekeurige sleutel van 256 bits in je browser. Hij wordt je één keer getoond en verder nergens bewaard: niet in onze systemen (die er niet aan te pas komen), niet in de opslag van je browser, niet in het verzegelde bestand. Er is geen wachtwoordzin om te raden en niets om brute force op los te laten. Wie de sleutel en het bestand heeft, kan het openen. Wie ze niet heeft, niet.

Dat heeft een harde consequentie: raakt de sleutel kwijt, dan is het bestand weg. Er is geen reset, geen supportticket, geen herstel. Dit is niet omdat we onbehulpzaam zijn. Een kopie die wij zouden kunnen herstellen, zou een kopie zijn die iemand kan stelen of opeisen.

De sleutellink bereikt nooit een server.

De deellink zet de sleutel achter de # in de URL. Dat deel, het fragment, houdt de browser voor zich. Het wordt nooit opgenomen in wat de browser naar een server stuurt, de onze of die van wie dan ook. Laadt deze pagina met een sleutel in de link, dan leest ze de sleutel, schakelt ze naar het tabblad Openen en haalt ze de sleutel meteen uit de adresbalk. Zo blijft hij niet in de zichtbare URL of in de browsergeschiedenis hangen.

Toch kan iedereen die zowel de link als het verzegelde bestand heeft, het openen. Daarom zegt deze pagina dat je het bestand en de sleutel via verschillende kanalen moet sturen.

Je ziet wat erin zit voordat er iets wordt bewaard.

Openen gebeurt in twee stappen. Eerst ontsleutelt de pagina alleen een klein manifest: de oorspronkelijke bestandsnaam, grootte en type. Dat laat ze aan je zien, met een luide waarschuwing bij bestandstypen die code kunnen uitvoeren (programma’s, scripts, installatieprogramma’s, documenten met macro’s, HTML) en bij namen die met een dubbele extensie zijn vermomd, zoals invoice.pdf.exe. Er wordt niets weggeschreven totdat je op ontsleutelen klikt. De pagina opent of toont de ontsleutelde inhoud zelf nooit. Ze biedt het bestand alleen aan als download.

Wees helder over wat versleuteling wel en niet bewijst. Een verzegeld bestand is vertrouwelijk onderweg. Het verzegelen zegt niets over wie het stuurde of over de vraag of de inhoud veilig is. Behandel een onverwacht verzegeld bestand net zo sceptisch als een onverwachte bijlage.

Waar de vertrouwensgrens werkelijk ligt.

Je draait code die deze website je heeft geserveerd. Als sealby.app of je verbinding ermee gecompromitteerd zou zijn, dan zou een kwaadaardige pagina kunnen lezen wat je erin stopt. Dat geldt voor elke webgebaseerde versleutelingstool, en we zeggen het liever dan te doen alsof het anders is. Wat we eraan doen: de pagina is een statisch bestand, en we houden haar vrij van code van derden. Met de geïnstalleerde Toolbox kun je een versie blijven gebruiken die je al hebt geladen. En het formaat staat hieronder gedocumenteerd, zodat er onafhankelijke tools op gebouwd kunnen worden.

Je eigen apparaat ligt ook binnen die grens. Browserextensies met paginatoegang, of malware op de machine, kunnen alles lezen wat een pagina kan lezen. Het verzegelde bestand verbergt zijn inhoud, maar niet alles. Wie het heeft, kan de grootte ervan zien (ruwweg die van het origineel) en dat het een door Sealby verzegeld bestand is.

De grenzen, in gewone taal

  • Sleutel kwijt = bestand kwijt. Geen uitzonderingen, met opzet.
  • Wij kunnen je bestanden of sleutels niet zien, dus we kunnen ze ook niet op malware scannen. De waarschuwing bij bestandstypen is alleen gebaseerd op de bestandsnaam. Het is geen garantie dat iets veilig is.
  • Iedereen met zowel het verzegelde bestand als de sleutel kan het openen. De tool weet of controleert niet wie dat is.
  • De grootte van het verzegelde bestand verraadt bij benadering de grootte van het origineel.
  • Eén bestand, tot 100 MB, per verzegeling. Zip meerdere bestanden eerst.

Het formaat, byte voor byte

Alles wat een technische lezer nodig heeft om de uitvoer van deze pagina zelfstandig te verifiëren, of om een .sealed-bestand in dertig regels Python te openen:

bytesfieldcontents
0–7magicASCII "SEALBY-W"
8versie0x01 — al het andere wordt geweigerd als ‘gemaakt met een nieuwere versie’
9algoritme0x01 = AES-256-GCM
10–13verzegelsalt4 bytes, CSPRNG, vers per verzegeling
14–15gereserveerdmoet nul zijn
16–eindechunkframeselk: uint32 BE ciphertextlengte, daarna de AES-GCM-ciphertext + tag van 16 bytes

Chunk 0 is het manifest: UTF-8-JSON {"name":…,"size":…,"type":…}. Chunks 1…N−1 zijn het bestand in stukken van 1 MiB. Per chunk i van N: nonce = salt ‖ uint64 BE i; geauthenticeerde data = header ‖ uint64 BE i ‖ uint64 BE N. Zo laten manipulatie, afkapping, herordening, verplaatsing en het samenplakken van chunks uit verschillende bestanden allemaal de authenticatie mislukken. Elk geval is bewezen met een vastgelegde negatieve test.

Sleutelreeks: base64url (zonder padding) van de sleutel van 32 bytes, gevolgd door de eerste 3 bytes van de SHA-256 daarvan, in totaal 47 tekens. Bij een typefout zakt hij voor de checksum in plaats van rommel op te leveren.

Referentie-opener (Python, cryptography-bibliotheek)
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"])

Dit is voor bestanden onderweg. De kluis is voor bestanden in rust.

Verzegelen beschermt een bestand op weg naar ergens. Sealby beschermt alles wat blijft: foto’s, bestanden en notities in versleutelde kluizen op je iPhone. Geen account, geen servers, leesbaar voor niemand behalve jou.

Download in de App Store

iPhone & iPad · iOS 17+ · Gratis