Veiligheid & transparantie
Hush is zero-knowledge. Dat is een grote claim, dus hier leggen we precies uit wat dat technisch betekent en wat de server wel en niet ziet. Geen marketing — alleen de werkende delen.
1 Hoe werkt zero-knowledge bij Hush?
Wanneer je een geheim aanmaakt, gebeurt het volgende stap voor stap in jouw browser:
- Er wordt een willekeurige 256-bit AES-sleutel gegenereerd via
crypto.getRandomValues()— uitsluitend in jouw browser. - De inhoud wordt versleuteld met AES-256-GCM. Alleen de versleutelde bytes (ciphertext) worden naar onze server gestuurd.
- De sleutel wordt in base64url achter de
#in de URL geplaatst. Browsers versturen het fragment ná#nooit naar de server. - De ontvanger opent de link, en zijn browser ontsleutelt lokaal met de sleutel uit het fragment.
Wie de link heeft, kan lezen. Hush kan niet bepalen wie de ontvanger is — wij zien alleen versleutelde bytes en weten niet eens welk geheim bij welke link hoort.
2 Wat slaat de server wél op?
- De versleutelde bytes (
ciphertext) — onleesbaar zonder de sleutel. - Een willekeurige
idvan 16 bytes (~22 karakters) om de paste op te zoeken. - De
iv(initialisatievector, 12 bytes) en — bij wachtwoordbescherming — eensalt(16 bytes). - Het tijdstempel van aanmaken, vervallen, en of het een burn-after-read is.
- Een eigenaars-
delete_tokenwaarmee je het geheim handmatig kunt vernietigen. - Voor rate-limiting en audit: een SHA-256-hash van je IP-adres samen met een server-secret pepper. Het echte IP wordt niet opgeslagen.
3 Wat slaat de server niet op?
- De inhoud van je geheim, in welke vorm dan ook.
- De versleutelingssleutel — die staat alleen in het URL-fragment, dat de browser nooit verstuurt.
- Je wachtwoord — uitsluitend gebruikt voor sleutelafleiding in je browser.
- De ontvanger — geen e-mailadres, geen identiteit, geen ontvangstbevestiging.
- Tracking-cookies, analytics, fingerprinting.
- Je ruwe IP-adres (alleen de gehashte versie voor anti-abuse).
4 Cryptografische bouwstenen
- Symmetrische encryptie
- AES-256-GCM (Authenticated Encryption with Associated Data — detecteert ook tampering)
- Sleutelgrootte
- 256 bits, gegenereerd via
crypto.getRandomValues()(Web Crypto API) - IV / nonce
- 12 bytes, per paste random
- Wachtwoord-KDF
- PBKDF2-SHA256, 250.000 iteraties, 16-byte salt — de afgeleide sleutel wordt ge-XOR'd met de URL-sleutel zodat beide aanwezig moeten zijn om te ontsleutelen
- Compressie
- Optioneel gzip vóór encryptie (via
CompressionStream) voor kleinere payloads - Burn-atomiciteit
SELECT … FOR UPDATE+DELETEin één transactie — geen race-window- Timing-resistantie
- Verificatie van de
delete_tokengebeurt methash_equals()(constant time)
5 Server-side hardening
- Strikte Content Security Policy (geen externe scripts, geen externe afbeeldingen).
Referrer-Policy: no-referrer— bij doorklikken lekt de link nooit naar derden.X-Frame-Options: DENY— geen embedding op andere sites.- Per-IP rate-limiting (per uur, configurabel) tegen brute-force pogingen.
- Body-limiet op uploads (server-side configureerbaar; client-side max 20 MB per bestand, tot 10 bestanden).
- Alleen prepared statements — PDO emulated prepares uit.
6 Responsible disclosure
Heb je een veiligheidsprobleem gevonden? Meld het verantwoord. Wij beantwoorden e-mails over security-issues met prioriteit en publiceren géén details totdat we een patch hebben uitgerold.
Contact: veilig@mci.nl · standaardformaat in /.well-known/security.txt.