Waarom hashes van wachtwoorden breken

Een wand vol archiefladen met één lade open, waarin twee bij elkaar passende kaartjes liggen.

Je leest het geregeld: "databank van website X gestolen, miljoenen wachtwoorden gelekt". Maar een goede site bewaart je wachtwoord niet — alleen de hash ervan. En uit een hash kan je het wachtwoord niet terugrekenen, dat weet je sinds het vorige hoofdstuk. Dus… is er dan een probleem? Ja. En in dit hoofdstuk speel jij de hacker om te zien waarom.

Woorden die je zo nodig hebt

Databank
De grote tabel waarin een website al haar gebruikers bewaart: naam, e-mailadres, en (als het goed is) de hash van het wachtwoord.
Opzoektabel (of "regenboogtabel")
Een lijst die iemand vooraf gemaakt heeft: links miljarden veelgebruikte wachtwoorden, rechts hun hash. Wie een hash tegenkomt, zoekt hem rechts op en leest links het wachtwoord af. Geen rekenen, alleen opzoeken.
Salt
Letterlijk "zout": een willekeurig stukje tekst dat de website aan je wachtwoord plakt vóór ze het hasht. Voor elke gebruiker een andere. Het is niet geheim — het staat gewoon naast de hash — maar het maakt elke opzoektabel waardeloos.
PBKDF2
Een hashfunctie die met opzet traag is: ze herhaalt het rekenwerk honderdduizenden keren. Voor jou een halve seconde bij het inloggen. Voor een hacker die miljarden wachtwoorden wil proberen, een muur.

Hoe een "onkraakbare" hash toch gekraakt wordt

De hacker rekent niet terug. Hij rekent vooruit. Hij neemt een lijst van de miljard meest gebruikte wachtwoorden — 123456, azerty, welkom, de namen van alle voetbalclubs — en berekent van elk de hash. Dat duurt even, maar hij hoeft het maar één keer te doen. Daarna vergelijkt hij de gestolen hashes met zijn lijst. Elke hash die overeenkomt, is een gekraakt wachtwoord. Geen wiskunde, alleen geduld en een grote harde schijf.

Speel de hacker

Alles gebeurt in je browser. Er wordt niets naar de server gestuurd. Typ hier toch nooit een wachtwoord dat je écht gebruikt — dat is een goede gewoonte.

  1. Klik Hash en zoek op. De demo hasht je wachtwoord en zoekt de hash op in een tabelletje van een paar dozijn veelgebruikte wachtwoorden. Gevonden? Dan ben je "gekraakt".
  2. Probeer azerty, voetbal, dokter. Probeer dan iets wat jij zelf verzint.
  3. Klik Zelfde wachtwoord, met salt. Zelfde wachtwoord, twee keer gehasht — en toch twee compleet verschillende hashes. Zoek ze op: niets.
  4. Klik Met PBKDF2 (traag) en kijk naar de tijd. Reken mee wat dat betekent voor iemand die tien miljoen keer moet proberen.

Salt: iedereen zijn eigen probleem

Zonder salt hebben alle gebruikers met wachtwoord welkom exact dezelfde hash. De hacker kraakt er één, en hij heeft ze allemaal. Met salt krijgt elke gebruiker een andere hash voor hetzelfde wachtwoord. De hacker moet nu voor élke gebruiker apart zijn hele lijst opnieuw hashen. Een lek van tien miljoen accounts wordt tien miljoen losse klussen.

Traagheid: het enige wapen dat echt telt

SHA-256 is razendsnel — een goede grafische kaart haalt miljarden hashes per seconde. Dat is handig voor bestanden en rampzalig voor wachtwoorden. Daarom gebruiken goede sites een functie die met opzet traag is. Klik in de demo op PBKDF2 en let op de tijd. Een paar honderd milliseconden voel jij nauwelijks bij het inloggen. Maar voor de hacker vermenigvuldigt elke poging met dat getal — en hij heeft er miljarden.

Wat dit voor jou betekent

Voor als je later zelf een website bouwt: schrijf dit nooit zelf. Elke programmeertaal heeft een ingebouwde functie die salt en traagheid goed regelt (in PHP heet die password_hash()). Zelf iets knutselen met een hash en een salt is de klassieke beginnersfout — en de reden achter de helft van de lekken in het nieuws.

Dit is wiskunde: hoe groot is groot?

Een wachtwoord van 8 kleine letters heeft 268 ≈ 200 miljard mogelijkheden. Klinkt veel — een grafische kaart is er in een minuut door. Vier willekeurige woorden uit een woordenboek van 5000 woorden: 50004 = 625 biljoen, en dat is nog zonder hoofdletters of cijfers. Dat is het verschil tussen machtsverheffen met een groot grondtal en een groot exponent. Wie dat gevoel voor grote getallen heeft, ontwerpt betere sloten dan wie dat niet heeft.