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.
Bezig met verzegelen…
Verzegeld.
Dit is je versleutelde bestand. Zonder de sleutel kan niemand het lezen. Wij niet, en niemand anders.
De sleutel — alleen nu te zien
Deze sleutel bestaat alleen op deze pagina, op dit moment. Hij wordt nergens opgeslagen of naartoe gestuurd. Raak je hem kwijt, dan kan niemand het bestand nog openen, wij ook niet. Bewaar hem voordat je weggaat.
Of deel de sleutel als link
De sleutel zit achter de # in de link. Browsers sturen dat deel nooit naar een server. De link komt uit op deze pagina, met het tabblad Openen klaar en de sleutel ingevuld, en haalt de sleutel daarna uit de adresbalk.
Stuur het bestand en de sleutel apart.
Wie zowel het verzegelde bestand als de sleutel heeft, kan het openen. Stuur ze via verschillende kanalen, bijvoorbeeld het bestand per e-mail en de sleutellink per sms. Zo bevat geen enkele inbox ze allebei.
Sleutel uit je link gelezen en uit de adresbalk gehaald, zodat hij buiten je geschiedenis blijft.
Bezig met controleren…
In dit verzegelde bestand
Er is nog niets bewaard. Dit is wat het verzegelde bestand zegt te bevatten:
- Naam
- Grootte
- Type
Pas op — dit bestandstype kan code uitvoeren op je apparaat
Ontsleuteld.
Het bestand is op je apparaat ontsleuteld en als download aangeboden. Niets ervan heeft deze pagina ooit verlaten.
Van de makers van Sealby — de versleutelde kluis voor iPhone
Sealby bewaart foto’s, bestanden en notities in versleutelde kluizen op je iPhone. Geen account, geen servers, leesbaar voor niemand behalve jou.
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:
| bytes | field | contents |
|---|---|---|
| 0–7 | magic | ASCII "SEALBY-W" |
| 8 | versie | 0x01 — al het andere wordt geweigerd als ‘gemaakt met een nieuwere versie’ |
| 9 | algoritme | 0x01 = AES-256-GCM |
| 10–13 | verzegelsalt | 4 bytes, CSPRNG, vers per verzegeling |
| 14–15 | gereserveerd | moet nul zijn |
| 16–einde | chunkframes | elk: 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.
Volledige byte-exacte specificatie (FORMAT-WEB-v1) ·Known-answer-testvectoren (JSON)
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.
iPhone & iPad · iOS 17+ · Gratis