Gratis privacytool

Versleutel een bestand in je browser

Kies een bestand, kies een wachtwoordzin en download een versleutelde kopie. AES-256-GCM, met de sleutel die in je browser wordt afgeleid. Er wordt niets geüpload en het werkt offline zodra de pagina geladen is. Het formaat staat hieronder byte voor byte gedocumenteerd, zodat je ons nergens op hoeft te geloven.

Draait volledig in dit tabblad. Er wordt niets geüpload en het werkt offline zodra het geladen is.

Elk bestand. Grote bestanden vragen geheugen. Zie de eerlijke grenzen hieronder.

Er is geen herstel. Een vergeten wachtwoordzin betekent een bestand dat niemand, wij ook niet, ooit nog kan openen.

Elke parameter, uitgeschreven

Cipher
AES-256-GCM (WebCrypto), 128-bits tag
Sleutelafleiding
PBKDF2-HMAC-SHA-256, 600.000 iteraties
KDF-salt
16 bytes, CSPRNG, vers per bestand
GCM-nonce
12 bytes, CSPRNG, vers per bestand
Geauthenticeerde data
de volledige header van 42 bytes, dus knoeien met welke vermelde parameter dan ook breekt het ontsleutelen
Codering wachtwoordzin
UTF-8, NFC-genormaliseerd (zodat dezelfde zin op elk apparaat dezelfde sleutel oplevert)

Eerlijke grenzen

Dit is niet het kluisformaat van de Sealby-app. De app leidt sleutels af met Argon2id, per toestel gekalibreerd, verpakt ze in de Secure Enclave en slaat inhoud op in ontkenbare containers met blokken. Dat kan een webpagina allemaal niet. Deze pagina is een losstaand hulpmiddel, gebouwd op wat browsers van zichzelf bieden.

PBKDF2 is niet geheugenintensief. Het is de enige sleutelafleidingsfunctie die browsers standaard meeleveren, en 600.000 iteraties maakt elke gok traag, maar een GPU-opstelling valt het nog steeds veel sneller aan dan Argon2id. De bescherming zit daarom in je wachtwoordzin: vier willekeurige woorden of meer, geen wachtwoord.

WebCrypto versleutelt in één keer. Er is geen streaming, dus het hele bestand zit tijdens de verwerking twee tot drie keer tegelijk in het geheugen. Honderden megabytes zijn prima op de meeste apparaten. Gebruik voor archieven van meerdere gigabytes een desktoptool. De versleutelde uitvoer verraadt ook de globale omvang van het bestand. De naam zit er versleuteld in, maar de grootte wordt niet verborgen.

Het formaat, byte voor byte

Alles wat een technische lezer nodig heeft om de uitvoer van deze pagina zelfstandig te verifiëren, of om die in twintig regels Python te ontsleutelen:

bytesfieldcontents
0–7magicASCII "SBXF0001"
8versie0x01
9algoritme0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256
10–13iteratiesuint32, big-endian (600.000)
14–29salt16 bytes
30–41nonce12 bytes
42–eindeciphertextAES-256-GCM van de payload, AAD = bytes 0–41; de laatste 16 bytes zijn de GCM-tag

Payload vóór versleuteling: [naamlengte van 2 bytes, big-endian][bestandsnaam, UTF-8][bestandsbytes]. De oorspronkelijke bestandsnaam reist versleuteld mee; bij het ontsleutelen wordt hij hersteld.

Referentie-ontsleutelaar (Python, cryptography-bibliotheek)
import sys, hashlib, struct, unicodedata
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SBXF0001" and raw[8] == 1 and raw[9] == 1
iters = struct.unpack(">I", raw[10:14])[0]          # 600000
salt, nonce, ct = raw[14:30], raw[30:42], raw[42:]
phrase = unicodedata.normalize("NFC", sys.argv[2]).encode()
key = hashlib.pbkdf2_hmac("sha256", phrase, salt, iters, 32)
plain = AESGCM(key).decrypt(nonce, ct, raw[:42])     # AAD = header
name_len = struct.unpack(">H", plain[:2])[0]
name = plain[2 : 2 + name_len].decode()
open(name, "wb").write(plain[2 + name_len :])
print("decrypted ->", name)

Dit is de demo. De kluis is het product.

Eén bestand, één wachtwoordzin, één pagina. Dat is wat een browser kan. Sealby doet het goed: Argon2id gekalibreerd op jouw toestel, sleutels in de Secure Enclave, en verborgen kluizen zonder opgeslagen lijst of telling.

Download in de App Store

iPhone & iPad · iOS 17+ · Gratis