Hush Nieuw geheim →

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 id van 16 bytes (~22 karakters) om de paste op te zoeken.
  • De iv (initialisatievector, 12 bytes) en — bij wachtwoordbescherming — een salt (16 bytes).
  • Het tijdstempel van aanmaken, vervallen, en of het een burn-after-read is.
  • Een eigenaars-delete_token waarmee 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 + DELETE in één transactie — geen race-window
Timing-resistantie
Verificatie van de delete_token gebeurt met hash_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.