Wat is een hash en waarom kom je het overal tegen in technologie?
Je hebt waarschijnlijk strings gezien zoals deze:
e3b0c44298fc1c149afbf4c8996fb924
27ae41e4649b934ca495991b7852b855
Ze verschijnen bij softwaredownloads ("verifieer de SHA-256 hash"), in gesprekken over blockchain, in discussies over wachtwoordbeveiliging en in talloze ontwikkelaarstools. Maar wat is een hash eigenlijk, en waarom is het zo fundamenteel voor moderne technologie?
Het concept in begrijpelijke taal
Een hashfunctie neemt elke invoer — een woord, een zin, een heel bestand — en produceert een uitvoer van vaste lengte, een hashwaarde (ook wel digest, checksum of vingerafdruk genoemd). De belangrijkste eigenschappen zijn:
- Deterministisch. Dezelfde invoer produceert altijd dezelfde uitvoer.
- Vaste lengte. Hoe groot de invoer ook is, de uitvoer is altijd even groot.
- Eenrichting. Je kunt de originele invoer niet reconstrueren vanuit de hash-uitvoer.
- Lawine-effect. Een kleine wijziging in de invoer produceert een compleet andere hash.
Zie het als een vingerafdruk voor gegevens. Net zoals je vingerafdruk jou uniek identificeert maar niet kan worden gebruikt om je gezicht te reconstrueren, identificeert een hash een stuk gegevens uniek maar kan het niet worden gebruikt om het origineel te reconstrueren.
Een eenvoudig voorbeeld
Dit is wat de SHA-256 hashfunctie doet met twee zeer vergelijkbare invoeren:
| Invoer | SHA-256 Hash (eerste 16 tekens) |
|---|---|
| "Hello" | 185f8db32271fe25... |
| "hello" | 2cf24dba5fb0a30e... |
| "hello!" | ce06092fb948d9ff... |
Het veranderen van een enkel teken (hoofdletter H naar kleine letter h) of het toevoegen van een uitroepteken produceert een compleet andere hash. Er is geen patroon, geen voorspelbare relatie. Dit is het lawine-effect in actie.
Wist je dat? De SHA-256 hash van een lege invoer (letterlijk niets) is e3b0c44298fc1c14.... Dit is een welbekende constante. Elke SHA-256 implementatie ter wereld produceert exact dezelfde uitvoer voor een lege invoer.
Veelgebruikte hash-algoritmen
MD5
- Uitvoer: 128 bits (32 hexadecimale tekens)
- Status: Gebroken voor beveiligingsdoeleinden. Botsingen (verschillende invoeren die dezelfde hash produceren) kunnen in seconden worden gegenereerd.
- Nog steeds gebruikt voor: Bestandsintegriteitscontroles waar beveiliging geen rol speelt (bijv. verifiëren dat een download niet beschadigd is).
SHA-1
- Uitvoer: 160 bits (40 hexadecimale tekens)
- Status: Verouderd voor beveiliging. Botsingen zijn aangetoond.
- Nog steeds gebruikt voor: Verouderde systemen, Git commit-identificaties.
SHA-256
- Uitvoer: 256 bits (64 hexadecimale tekens)
- Status: Huidige standaard. Geen bekende praktische aanvallen.
- Gebruikt voor: Wachtwoordopslag, digitale handtekeningen, blockchain, bestandsverificatie, TLS-certificaten.
SHA-512
- Uitvoer: 512 bits (128 hexadecimale tekens)
- Status: Huidige standaard. Nog grotere beveiligingsmarge dan SHA-256.
- Gebruikt voor: Hoge-beveiligingstoepassingen, sommige wachtwoordhashingsystemen.
Waarschuwing MD5 en SHA-1 mogen nooit worden gebruikt voor beveiligingsdoeleinden (wachtwoorden, digitale handtekeningen, certificaten). Ze zijn cryptografisch gebroken. Gebruik SHA-256 of SHA-512 voor alles wat beveiligingsgerelateerd is.
Waar hashes worden gebruikt
Wachtwoordopslag
Wanneer je een account aanmaakt, slaat de website niet (of zou niet moeten) je eigenlijke wachtwoord op. In plaats daarvan slaat het de hash van je wachtwoord op. Wanneer je inlogt, hasht het systeem het wachtwoord dat je invoert en vergelijkt het met de opgeslagen hash. Als ze overeenkomen, ben je binnen.
Dit betekent dat zelfs als een database wordt gehackt, aanvallers hashes krijgen, geen wachtwoorden. Ze kunnen de hash niet omkeren om je wachtwoord te vinden (hoewel ze kunnen proberen het te raden door veelvoorkomende wachtwoorden te hashen en te vergelijken).
Moderne wachtwoord-hashing gaat verder met algoritmen zoals bcrypt, scrypt en Argon2, die salt (willekeurige gegevens) toevoegen en opzettelijk traag zijn om brute-force raden onpraktisch te maken.
Bestandsverificatie
Wanneer je software downloadt, verstrekt de website vaak een SHA-256 hash van het bestand. Na het downloaden hash je het bestand zelf en vergelijk je. Als de hashes overeenkomen, is het bestand precies wat de uitgever bedoelde. Als ze verschillen, is het bestand beschadigd of gemanipuleerd tijdens het downloaden.
Verwacht: a1b2c3d4e5f6...
Jouw bestand: a1b2c3d4e5f6... ✓ Overeenkomst — bestand is authentiek
Blockchain en cryptocurrency
Elk blok in een blockchain bevat de hash van het vorige blok, waardoor een onbreekbare keten ontstaat. Als iemand een eerdere transactie probeert te wijzigen, verandert de hash van dat blok, wat de keten vanaf dat punt verbreekt en manipulatie onmiddellijk detecteerbaar maakt.
Bitcoin mining is in essentie een competitie om een invoer te vinden die een SHA-256 hash produceert die begint met een bepaald aantal nullen.
Digitale handtekeningen
Wanneer je een document digitaal ondertekent, versleutel je niet het hele document met je privésleutel. In plaats daarvan wordt het document gehasht en wordt de hash versleuteld. Dit is veel sneller en produceert een compacte handtekening.
Gegevensdeduplicatie
Cloudopslagdiensten gebruiken hashes om dubbele bestanden te detecteren. Als twee gebruikers hetzelfde bestand uploaden, heeft het dezelfde hash, en de dienst hoeft maar één kopie op te slaan.
Git versiebeheer
Elke commit, elk bestand en elke boomstructuur in Git wordt geïdentificeerd door zijn SHA-1 hash. Zo weet Git of een bestand is gewijzigd en zo volgt het de volledige geschiedenis van een project.
Wist je dat? Git migreert geleidelijk van SHA-1 naar SHA-256. De transitie begon omdat SHA-1 botsingen in 2017 werden aangetoond, waardoor iemand theoretisch twee verschillende commits met dezelfde identificatie zou kunnen maken.
Het onomkeerbaarheidsprobleem (en waarom het ertoe doet)
De eenrichtingsaard van hashes is zowel hun grootste kracht als een veelvoorkomende bron van verwarring.
Je kunt een hash niet "ontsleutelen." Een hash is geen versleuteling. Versleuteling is tweerichtingsverkeer: versleutelen met een sleutel, ontsleutelen met een sleutel. Hashing is eenrichting: je kunt de hash berekenen vanuit de invoer, maar je kunt de invoer niet berekenen vanuit de hash.
De enige manier om een hash te "omkeren" is de originele invoer te raden, je gok te hashen en te controleren of het overeenkomt. Voor korte, eenvoudige invoeren (zoals veelgebruikte wachtwoorden) is dit haalbaar. Voor lange, willekeurige invoeren is het rekenkundig onmogelijk.
Dit is waarom wachtwoordlengte zo belangrijk is. De hash van "password123" kan worden gevonden door veelgebruikte wachtwoorden te proberen. De hash van "j8#kL9$mN2@pQ5&" zou langer duren dan de leeftijd van het universum om door raden te vinden.
Probeer het zelf
De beste manier om hashes te begrijpen is door te experimenteren. Hash een woord, verander dan één teken en zie hoe de uitvoer compleet verandert. Hash een bestand voor en na wijziging en zie het verschil.
Tip Genereer en verifieer hashes voor elke tekst of elk bestand: Hashes genereren en verifiëren. Probeer SHA-256, MD5, SHA-512 en meer — direct, gratis, in je browser.
Ontdek hashes hands-on:
Gratis, direct en zonder registratie.