Berichtenapps: Signal en WhatsApp
Je stuurt een bericht naar je beste vriend. Het staat een paar honderdsten later op zijn scherm, en onderweg is het door minstens vijf computers gegaan die je nooit gezien hebt. Toch beweren Signal en WhatsApp allebei dat niemand van die vijf het gelezen heeft — ook zijzelf niet. Dat is een grote belofte, en ze is waar te maken. Dit hoofdstuk laat zien met welke onderdelen, en waar de belofte ophoudt.
Woorden die je zo nodig hebt
- End-to-end-encryptie
- Versleuteld van jouw toestel tot dat van de ander, en nergens tussenin ontsleuteld. De server ziet alleen cijfertekst. Vaak afgekort tot E2EE.
- Transportversleuteling
- Alleen versleuteld op de lijn. De server ontsleutelt, kijkt, en versleutelt opnieuw voor het volgende stuk. Dat is wat het slotje in je browser doet, en het is iets heel anders.
- Signalprotocol
- Het recept dat Signal bedacht en dat ook WhatsApp gebruikt. Het is geen app maar een afspraak over welke berekening wanneer gebeurt.
- Voorraadsleutel (prekey)
- Een halve sleuteluitwisseling die je op voorhand bij de server achterlaat, zodat iemand je kan bereiken terwijl je slaapt.
- Ratchet
- Engels voor ratel: het tandwiel van een ratelsleutel, dat maar één kant op kan draaien. Hier: de sleutel schuift bij elk bericht een tand op en kan nooit terug.
- Metadata
- Alles rond het bericht heen: wie, aan wie, wanneer, hoe vaak, hoe groot. Niet de inhoud, wel de omslag.
Versleuteld is niet hetzelfde als end-to-end
Bijna elke app zegt dat ze versleutelt, en bijna elke app zegt de waarheid. De vraag is tot waar. Bij gewone transportversleuteling gaat je bericht versleuteld naar de server, wordt het daar ontsleuteld, staat het leesbaar op een schijf, en gaat het opnieuw versleuteld naar je vriend. Wie die server bezit, leest mee: het bedrijf, een werknemer die te ver gaat, een inbreker, een rechter met een bevel.
Bij end-to-end-encryptie heeft de server de sleutel niet. Niet omdat het bedrijf belooft er niet naar te kijken, maar omdat er niets is om naar te kijken. Dat verschil is niet juridisch of ethisch, het is wiskundig, en het blijft staan ook als het bedrijf van eigenaar wisselt.
| Transportversleuteling | End-to-end-encryptie | |
|---|---|---|
| Wie heeft de sleutel? | jij, de server, de ander | jij en de ander |
| Wat staat er op de server? | je bericht, leesbaar | cijfertekst |
| Wat kan de server aan de politie geven? | de inhoud | de cijfertekst, en die is waardeloos |
Hoe bereik je iemand die slaapt?
hoofdstuk 5 eindigde met een beperking: Diffie–Hellman vraagt twee partijen die tegelijk meedoen. Jij stuurt iets, zij stuurt iets terug, en pas dan heb je een gedeeld geheim. Maar je vriend slaapt om drie uur 's nachts, en je bericht moet er toch staan als hij wakker wordt.
De oplossing heet X3DH, van Extended Triple Diffie–Hellman. Het idee: je doet je helft van de uitwisseling op voorhand, en laat ze bij de server achter.
- Als je de app installeert, maakt je toestel een stapeltje sleutelhelften aan: één vaste (je identiteit) en een voorraad wegwerpexemplaren. De publieke helften gaan naar de server, de geheime blijven op je toestel.
- Wil ik jou iets sturen terwijl je offline bent, dan haal ik zo'n stapeltje op. Meer heb ik niet nodig.
- Ik doe de uitwisseling in mijn eentje: mijn geheim tegen jouw publieke helften. Daar komt een gedeeld geheim uit. Ik versleutel mijn bericht en stuur het door.
- Word je wakker, dan doe jij dezelfde berekening andersom met jouw geheime helften. Zelfde geheim, bericht leesbaar. Wij hebben geen seconde tegelijk online gestaan.
Het is geen nieuwe wiskunde: het is drie of vier keer dezelfde Diffie–Hellman uit dat hoofdstuk, op een elliptische kromme, en de uitkomsten worden aan elkaar geplakt en door een hashfunctie gehaald (hoofdstuk 2). Wat eruit komt is gewoon een AES-sleutel, en vanaf dan ben je terug bij hoofdstuk 4.
Signal is hier in 2023 overgestapt op PQXDH. Dat is dezelfde constructie, maar het gedeelde geheim wordt nu op twee manieren tegelijk berekend: met de klassieke kromme X25519 én met CRYSTALS-Kyber, een methode waarvan men denkt dat een quantumcomputer er ook niet doorheen komt. Wie het geheim wil, moet allebei breken. Signal kondigde dat aan op 19 september 2023.
De sleutel verandert bij elk bericht
Eén gedeeld geheim voor je hele vriendschap zou een slecht idee zijn. Wie er ooit aan geraakt, leest alles: de berichten van vandaag én die van drie jaar geleden. Daarom gooit het Signalprotocol de sleutel na elk bericht weg en rekent het een nieuwe uit. Dat mechanisme heet de double ratchet, de dubbele ratel.
Er draaien twee tandwielen door elkaar. Het eerste is een ketting van hashfuncties: uit de sleutel van dit bericht reken je die van het volgende uit, en die berekening kan maar één kant op — precies de eigenschap uit hoofdstuk 2. Het tweede tandwiel is een verse Diffie–Hellman: telkens als er antwoord komt, sturen jullie allebei een nieuwe publieke helft mee en begint de ketting van voren af aan.
Gevolg 1: wie je telefoon vandaag kraakt, kan gisteren niet lezen
Stel dat iemand je toestel in handen krijgt en de sleutel die er op dit moment in zit eruit haalt. Met die sleutel kan hij het volgende bericht ontsleutelen. Het vorige niet, en dat van vorige week al helemaal niet: die sleutels bestaan niet meer, en uit de sleutel van nu terugrekenen naar die van toen is precies de hashfunctie omkeren. Dat heet forward secrecy, voorwaartse geheimhouding. Het is hetzelfde principe als een ratelsleutel: je kan de tandjes vooruit tellen, niet achteruit.
Gevolg 2: hij is de sleutel na een paar berichten weer kwijt
Nu de andere kant. Iemand heeft je sleutel gestolen en leest mee. Zolang jij alleen maar zendt, blijft dat zo — hij draait de hashketting gewoon mee vooruit. Maar zodra je vriend antwoordt, komt er een verse Diffie–Hellman-helft mee, en daar zit een nieuw geheim getal in dat de meelezer nooit gezien heeft. Vanaf dat moment klopt zijn ketting niet meer en is hij eruit. Dat heet post-compromise security, of zelfherstel: het gesprek geneest vanzelf, zonder dat iemand iets hoeft te merken of te doen.
Dit is het verschil met de sleutelkaart uit hoofdstuk 8.1. Daar heb je één sleutel die blijft, en wie hem te pakken krijgt, heeft hem voorgoed. Handig om te begrijpen wat er gebeurt, onbruikbaar voor een gesprek dat jaren duurt.
Praat je wel met je vriend?
Hier komt het gat uit hoofdstuk 5 terug. Al die wiskunde zorgt ervoor dat alleen jij en de eigenaar van die publieke sleutelhelften kunnen meelezen. Ze zegt niet dat die eigenaar je vriend is. Wie de server bezit, zou jou zijn eigen sleutelhelften kunnen geven in plaats van die van je vriend, met jou én met hem apart een gesprek voeren en alles doorgeven. Een man-in-the-middle, en jullie merken er niets van.
Daarom kan je het zelf controleren. Uit jouw publieke sleutel en die van je vriend rekenen de apps samen één getal uit, en dat getal kan je vergelijken. Klopt het aan beide kanten, dan zit er niemand tussen. Het duurt tien seconden en bijna niemand doet het.
| Signal | ||
|---|---|---|
| Hoe heet het? | veiligheidsnummer (safety number) | beveiligingscode (security code) |
| Waar vind je het? | open het gesprek, tik op de naam bovenaan, kies Veiligheidsnummer bekijken | open het gesprek, tik op de naam bovenaan, kies Versleuteling |
| Wat zie je? | een QR-code en 60 cijfers in 12 groepjes van vijf | een QR-code en 60 cijfers |
| Hoe vergelijk je? | zit je naast elkaar: de ene scant de QR-code van de andere. Zit je niet naast elkaar: lees de cijfers voor aan de telefoon | hetzelfde |
| Daarna | je kan de contactpersoon op Geverifieerd zetten; er verschijnt een vinkje in de kop van het gesprek | een groen vinkje bij een geslaagde scan |
Vergelijk nooit via de app zelf. Als daar iemand tussen zit, past die de cijfers gewoon aan. Doe het naast elkaar met de QR-code, of aan de telefoon waar je de stem herkent.
Springt je veiligheidsnummer plots op een ander getal? Meestal betekent het dat je vriend een nieuwe telefoon heeft of de app opnieuw installeerde — nieuwe sleutels, nieuw nummer. Maar het is exact hetzelfde signaal dat een man-in-the-middle zou geven. Vraag het hem, via een ander kanaal dan die chat.
Wat de app-maker nog wél ziet
De inhoud niet. De omslag wel, en dat is meer dan je denkt. Wie met wie, hoe laat, hoe vaak, hoe lang een gesprek duurde, vanaf welk IP-adres, met welk toestel. Je hoeft geen enkel bericht te lezen om te weten dat iemand om 02:14 een half uur belde met een dokter van wacht, en de dag erna drie keer met zijn beste vriendin. De inhoud is geheim; het verhaal niet.
Op dit punt verschillen Signal en WhatsApp echt, en het verschil zit niet in de encryptie — die is bij allebei hetzelfde protocol. Het zit in wat het bedrijf bijhoudt.
| Signal | ||
|---|---|---|
| Wat gaven ze al aan een rechter? | de datum waarop het account werd aangemaakt en de datum van de laatste verbinding. Meer hebben ze niet. | naam, startdatum van de dienst, laatst gezien, IP-adres, type toestel, e-mailadres, je ‘info’-tekst, profielfoto, groepen en contacten — volgens hun eigen richtlijnen voor overheden. |
| Wie praat met wie? | Signal verbergt dat met sealed sender: de afzender zit mee in de versleutelde omslag, de server ziet alleen de bestemmeling. | de server ziet welk nummer welk nummer schrijft, wanneer en hoe lang. |
| Je adresboek | Signal bewaart geen contactenlijst, groepsnamen of profielnamen op de server; ze staan versleuteld. | hoort bij de gegevens die het bedrijf heeft. |
Signal is een vzw die van giften leeft, WhatsApp hoort bij een bedrijf dat van advertenties leeft. Dat verklaart het verschil beter dan eender welk technisch argument: metadata bewaren kost geld en levert alleen iets op als je er iets mee doet.
De achterdeur die je zelf openzet: de back-up
Je kan alles goed doen en het toch weggeven. Zet je je chats in een gewone cloudback-up, dan staan ze daar leesbaar. Niet omdat de encryptie faalde, maar omdat je er zelf een kopie naast legde die er niet onder valt. Wie aan die cloud kan, heeft je hele gesprekgeschiedenis, en de mooiste ratel van de wereld doet daar niets aan.
WhatsApp noemt de versleutelde back-up in zijn eigen aankondiging een extra, optionele laag die je zelf aanzet. Je vindt hem bij Instellingen › Chats › Chatback-up › End-to-end-versleutelde back-up. Je kiest daar zelf waarmee je hem sluit: een toegangssleutel (passkey, je vingerafdruk of gezicht), een wachtwoord, of een sleutel van 64 tekens die je overschrijft en bewaart. Ga het na op je eigen toestel — het is de ene instelling in dit hoofdstuk die je vandaag kan veranderen.
Kies je het wachtwoord, dan komt de echte sleutel in een beveiligde kluis bij WhatsApp te liggen, die hem pas vrijgeeft als het wachtwoord klopt en die het aantal pogingen telt. Kies je de 64 tekens, dan bestaat de sleutel alleen op papier bij jou. Dat tweede is veiliger en onvergeeflijker: raak je hem kwijt, dan is je back-up weg, en niemand kan hem terughalen. Dat is geen slechte dienstverlening, dat is wat het woord end-to-end betekent.
Signal doet standaard niets met de cloud. Wil je toch een back-up, dan krijg je een herstelsleutel van 64 tekens die op je eigen toestel gemaakt wordt en nooit naar de server gaat — hetzelfde principe, dezelfde verantwoordelijkheid.
En de eenvoudigste lek van al: het scherm van de ander. Een schermafdruk, iemand die meekijkt op de bus, of een telefoon die zonder code op tafel ligt. Geen enkel protocol beschermt tegen een bericht dat gewoon gelezen wordt door iemand die er mag zijn. Wat dat praktisch betekent voor je toestel zelf, staat in hoofdstuk 7.6.
Dit is wiskunde: bewijzen dat een gesprek klopt
De ratel is één lange ketting: k1 = H(k0), k2 = H(k1), en zo verder, met H een hashfunctie. Dat de ketting maar één kant op kan, is geen ontwerpkeuze van Signal maar een eigenschap van H. Alle beloftes hierboven — forward secrecy, zelfherstel — zijn gevolgen die je uit die ene eigenschap afleidt.
Zulke afleidingen zijn te ingewikkeld om met de hand te vertrouwen, want een protocol heeft tientallen berichten die in elke volgorde kunnen aankomen, verdwijnen of herhaald worden. Daarom bestaat er een vak dat protocollen bewijst in plaats van ze te testen: je schrijft het protocol op als wiskundig object, je schrijft op wat een aanvaller mag doen, en je leidt af dat hij niet wint. Voor het Signalprotocol deden Katriel Cohn-Gordon, Cas Cremers, Benjamin Dowling, Luke Garratt en Douglas Stebila dat in 2017, in een artikel met de naam A Formal Security Analysis of the Signal Messaging Protocol.
Dat vakgebied heet formele verificatie, en het zit op de grens van logica en informatica. Het is het enige gebied in de beveiliging waar je niet hoeft te hopen: je hebt een bewijs, of je hebt er geen.