Hashfuncties

Voorwerpen van allerlei formaat vallen in een trechter en komen er onderaan uit als identieke, even grote tegeltjes.

Hoe weet een website dat je wachtwoord juist is, zonder je wachtwoord te kennen? Hoe merkt je telefoon dat een gedownload bestand onderweg beschadigd is? Beide keren met hetzelfde trucje: een vingerafdruk van de gegevens. Klein, altijd even groot, en uniek voor wat erin ging.

Woorden die je zo nodig hebt

Hash (of hashfunctie)
Een rekenmachine die je iets geeft — een woord, een foto, een heel boek — en die er altijd een even lange reeks tekens van maakt. Dezelfde invoer geeft altijd dezelfde uitvoer. Iets anders invoeren, ook maar één letter, geeft een compleet andere uitvoer.
Bit
Het kleinste stukje informatie: een 0 of een 1. Acht bits maken een byte. Als iets "256 bits" is, zijn dat 256 nullen en enen op een rij.
SHA-256
De naam van de hashfunctie die vandaag het meest gebruikt wordt. De 256 is het aantal bits in de uitvoer: altijd precies 256, of je nu één letter of een hele film invoert. In hexadecimaal zijn dat 64 tekens.
Algoritme
Een vast recept van rekenstappen. SHA-256, SHA-1 en MD5 zijn drie verschillende recepten met hetzelfde doel.
Hexadecimaal
Ken je uit hoofdstuk 1: bytes opschrijven met de cijfers 0–9 en de letters a–f, twee tekens per byte. Elk hextekentje staat dus voor vier bits. Zo wordt een hash hieronder getoond — en nergens anders voor gebruikt.

Drie regels waar een hash zich aan houdt

RegelWat het betekent
Eenrichtingsverkeer Uit de hash kan je de invoer niet terugrekenen. Niet "moeilijk", niet "met een snelle computer wel" — er bestaat geen weg terug. Zoals je uit een gehakte biefstuk de koe niet meer terugkrijgt.
Geen botsingen Twee verschillende invoeren mogen niet dezelfde hash krijgen. In theorie kan het (er zijn oneindig veel teksten en maar 2256 hashes), maar ze vinden lukt niemand.
Lawine-effect Eén letter anders, en ongeveer de helft van alle bits in de uitvoer klapt om. Er blijft niets over dat op de vorige hash lijkt.

Probeer het zelf

Alles gebeurt in je browser. Er wordt niets naar de server gestuurd.

  1. Klik Maak de vingerafdruk. Je ziet vier hashes van dezelfde zin, met vier verschillende recepten. Let op hoe lang elk is.
  2. Verander één letter in de zin en klik opnieuw. Vergelijk. Herken je nog iets?
  3. Klik Toon het lawine-effect: de demo verandert zelf één teken en telt hoeveel bits er omklappen.
  4. Plak een hele lange tekst — een songtekst, een opstel. De hash blijft even lang.

Wat je daar precies ziet staan

Die rijen tekens zijn geen base64. Ze bestaan alleen uit 0–9 en a–f, en dat is hexadecimaal: twee tekens per byte, vier bits per teken. 64 tekens × 4 = 256 bits, precies wat er achter SHA-256 staat. Bij SHA-1 tel je 40 tekens, dus 160 bits.

Waarom hier hexadecimaal en in hoofdstuk 1 base64? Omdat het hier om kijken gaat. Hexadecimaal is langer maar je kan het nog volgen: elk teken is precies vier bits, en je kan twee hashes naast elkaar leggen en letter per letter vergelijken. Base64 is korter en dus handiger om te versturen, maar de grens tussen twee bytes valt er middenin een teken. Dezelfde bytes, een andere manier om ze op te schrijven — exact het punt van het vorige hoofdstuk.

Waarom die lengte ertoe doet

256 bits betekent 2256 mogelijke uitkomsten. Dat is een getal met 78 cijfers. Ter vergelijking: het aantal atomen in het heelal is een getal met ongeveer 80 cijfers. Elke mogelijke tekst krijgt een plaatsje in een ruimte zo groot als het heelal — de kans dat twee verschillende teksten toevallig op dezelfde plek landen, is praktisch nul.

De les die je niet kan zíen

Kijk in de demo naar de regel met SHA-1. Die ziet er precies even willekeurig uit als SHA-256, alleen korter: 160 bits in plaats van 256, dus 40 hextekens in plaats van 64. Toch is SHA-1 gebroken: in 2017 toonden onderzoekers van Google en het CWI in Amsterdam twee verschillende PDF-bestanden met exact dezelfde SHA-1-hash. De regel "geen botsingen" was doorbroken. MD5 was al veel eerder weg.

Aan de uitvoer merk je daar niets van. Of een hashfunctie deugt, hangt niet af van hoe willekeurig ze eruitziet, maar van of wiskundigen er een zwakke plek in gevonden hebben. Daarom gebruik je vandaag SHA-256 en niet iets wat er "ook goed uitziet".

Kan je een hash "decrypteren"? Nee. Er is niets versleuteld, er is niets om te ontsleutelen. Toch bestaan er websites die beweren dat ze het kunnen — en soms lukt het ze echt. Hoe dat kan, en waarom dat voor jouw wachtwoorden belangrijk is, is het volgende hoofdstuk.

Dit is wiskunde: de verjaardagsparadox

Gooi een dobbelsteen. Hoe vaak moet je gooien voor je een zes hebt? Gemiddeld zes keer. Maar hoe vaak moet je gooien voor je eender welk getal een tweede keer ziet? Na vier worpen is die kans al 72 %. Dat gaat véél sneller — en het is hetzelfde verschijnsel als in een klas: met 23 leerlingen is de kans dat er twee op dezelfde dag jarig zijn, groter dan 50 %. Terwijl er 365 dagen zijn.

De truc zit in wat je zoekt. Je zoekt niet iemand die op jouw verjaardag jarig is — daarvoor heb je ruim 250 mensen nodig. Je zoekt eender welke twee. Met 23 leerlingen kan je 253 verschillende duo's vormen, en elk duo is een kans op een dubbel. Daarom komt "dubbel" zoveel sneller dan je buikgevoel zegt.

MogelijkhedenEen dubbel is waarschijnlijk na
6 (een dobbelsteen)4 worpen
365 (verjaardagen)23 leerlingen
1 000 000ongeveer 1 200 pogingen
2256 (SHA-256)ongeveer 2128 pogingen

Het is telkens ongeveer de vierkantswortel van het aantal mogelijkheden. Bij een miljoen mogelijkheden heb je al een dubbel na een goede duizend pogingen — niet na een half miljoen.

Een hash is de "verjaardag" van een tekst: elke tekst krijgt er één, uit 2256 mogelijke. Een botsing — twee teksten met dezelfde hash — is dus gewoon twee leerlingen die samen jarig zijn. En de tabel zegt hoeveel teksten je moet uitproberen voor dat waarschijnlijk gebeurt: geen 2256, maar 2128. Een hash is maar half zo sterk als zijn lengte laat uitschijnen.

Dat is de reden dat 256 de standaard is en niet 128. Een hash van 128 bits geeft een botsing na 264 pogingen — en zoveel hashes rekenen alle computers die vandaag Bitcoin draaien samen uit in minder dan een seconde. Met 256 bits blijven er 128 over, en dát haalt niemand. Dit is kansrekening: één sommetje over dobbelstenen bepaalt hoe lang elke hash ter wereld moet zijn.