Gebruik een cryptografische hashfunctie om de echtheid van data te verificiëren

Een cryptografische hashfunctie is een algoritme dat kan worden uitgevoerd op data zoals een individueel bestand of een wachtwoord, om een waarde te produceren die een controlesom heet.

Het belangrijkste gebruik van een cryptografische hashfunctie is het verifiëren van echtheid van data. Van twee bestanden kan worden aangenomen dat ze alleen identiek zijn als de checksums  die worden gegenereerd vanuit elk bestand, met dezelfde cryptografische hashfunctie, identiek zijn.

Sommige, veelgebruikte cryptografische hashfuncties zijn MD5 en SHA-1, hoewel er ook vele anderen bestaan.

Cryptografische hashfuncties worden ook vaak “hashfuncties” genoemd, maar dat is technisch niet correct.  Een hashfunctie is een generische term die cryptografische hashfuncties omvat, samen met andere soorten algoritmen zoals cyclic redundancy checks.

Cryptografische hashfuncties: een gebruikerscase
Stel je download de laatste versie van de Firefox browser. Om de één of andere reden heb je hem moeten downloaden van een andere site dan Mozilla´s. Omdat het niet gehost wordt op een site die je hebt geleerd te vertrouwen, zou je graag zeker willen zijn dat het bestand dat je zojuist hebt gedownload exact hetzelfde is als het bestand dat Mozilla aanbiedt.

Door een checksum rekenmachine te gebruiken, bereken je een checksum met behulp van een bepaalde cryptografische hashfunctie, zoals SHA-2, die je vervolgens vergelijkt met die op de Mozilla site. Als ze gelijk zijn kun je er redelijk zeker van zijn dat de download die jij hebt, degene is die Mozilla wilde dat je hebt.

Kunnen cryptografische hashfuncties teruggedraaid worden?
Cryptografische hashfuncties zijn ontworpen om te voorkomen dat de checksums worden teruggedraaid naar de oorspronkelijke teksten. Echter, hoewel ze bijna onmogelijk zijn om terug te draaien, zijn ze niet 100% gegarandeerd om data te beveiligen.

Hackers kunnen een rainbow table gebruiken om de oorspronkelijke teksten te achterhalen.

Rainbow tables zijn woordenboeken met duizenden, miljoenen of zelfs miljarden checksums, opgeschreven naast hun bijbehorende tekstwaarde.

Terwijl dit technisch gezien niet het terugdraaien van het cryptografisch hash algoritme is, zou het dat net zo goed kunnen zijn, aangezien het zo makkelijk is. In werkelijkheid, aangezien geen enkele rainbow table elke mogelijke checksum die bestaat kan tonen, zijn ze vaak alleen behulpzaam voor simpele zinnen zoals zwakke wachtwoorden.

Hier vind je een vereenvoudigde versie van een rainbow table om te laten zien hoe het werkt wanneer je een SHA-1 cryptografische hashfunctie gebruikt.

Plaintext SHA-1 Checksum
12345 8cb2237d0679ca88db6464eac60da96345513964
password1 e38ad214943daad1d64c102faec29de4afe9da3d
ilovemydog a25fb3505406c9ac761c8428692fbf5d5ddf1316
Jenny400 7d5eb0173008fe55275d12e9629eef8bdb408c1f
dallas1984 c1ebe6d80f4c7c087ad29d2c0dc3e059fc919da2

Een hacker moet weten welk cryptografisch hash algoritme was gebruikt om de checksums te genereren om de waarden uit te zoeken.

Als aangevulde beveiliging voeren sommige websites die gebruikerswachtwoorden opslaan extra functies uit op het cryptografisch hash algoritme nadat de waarde al is gegenereerd maar nog niet is opgeslagen. Dit proces produceert een nieuwe waarde die alleen begrepen kan worden door de webserver en die niet overeenkomt met de oorspronkelijke checksum.

Bijvoorbeeld, nadat een wachtwoord in is gevoerd en de checksum is gegenereerd, kan het verdeeld woorden en opnieuw worden gerangschikt voordat het opgeslagen wordt in het wachtwoord-database, of kunnen bepaalde tekens verwisseld worden met andere. Wanneer een authenticatie wordt geprobeerd de volgende keer dat de gebruiker inlogd, draait de webserver deze extra functie terug  en de oorspronkelijke checksum wordt weer gegenereerd om te verifiëren dat het gebruikerswachtwoord geldig is.

Deze stappen beperken het nut van een hack waar alle checksums worden gestolen. Het idee is een functie uit te voeren die niet bekend is, dus als de hacker weet welke cryptografische hashfunction is gebruikt, maar niet de aangepaste, dan is het niet nuttig om de wachtwoorden hun checksums te weten.

Wachtwoorden en cryptografische hashfuncties
Een database slaat gebruikerswachtwoorden op, op een manier die gelijk is aan een rainbow table. Wanneer je wachtwoord is ingevoerd, wordt de checksum gegenereerd en vergeleken met die gelinkt aan je username. Je wordt dat toegang toegekend als deze identiek zijn.

Ervanuitgaand dat een cryptografische hashfunctie een niet-omkeerbare checksum produceert, is het veilig om een wachtwoord te kiezen zo simpel als 12345, in plaats van 12@34$5, simpelweg omdat de checksums niet begrepen kunnen worden?
Nee, en dit is waarom.

Deze twee wachtwoorden zijn beide onmogelijk om te ontcijferen door alleen de checksums te bekijken:

MD5 for 12345: 827ccb0eea8a706c4c34a16891f84e7b

MD5 for 12@34$5: a4d3cc004f487b18b2ccd4853053818b

Op het eerste gezicht zou je denken dat het prima is welke dan ook van deze wachtwoorden te gebruiken. Dit klopt, als een aanvaller probeert je wachtwoord te achterhalen door de MD5 checksum te raden, wat niemand diet, maar niet waar als een brute force of dictionary attack wordt uigevoerd, wat beide een populaire tactiek is.

Een brute force attack komt voor wanneer meerdere, verschillende steekproeven worden genomen bij het raden van een wachtwoord. In dit geval zou het makkelijk zijn om 12345 te raden, maar best lastig om de andere uit te vinden. Een dictionary attack is vergelijkbaar omdat de aanvaller elk woord, nummer of zin van een lijst met veel- en niet veel voorkomende wachtwoorden kan proberen, en 12345 is één van die veelvoorkomende wachtwoorden.

Hoewel cryptografische hashfuncties moeilijke tot onmogelijk te raden checksums produceert, zou je alsnog een complex wachtwoord moeten gebruiken voor al je online en lokale accounts.

Als je niet zeker weet of jouw wachtwoord sterk is, bekijk dan hier voorbeelden van zwakke en sterke wachtwoorden.

Meer informatie over cryptografische hashfuncties
Het lijkt misschien alsof cryptografische hashfuncties gerelateerd zijn aan encryption, maar de twee werken verschillend.

Encryption is een tweerichtingproces waarbij iets versleuteld wordt om onleesbaar te worden en dan gedecodeerd worden om weer normaal gebruikt te worden. Je kunt bestanden die je hebt opgeslagen coderen zodat iedereen die toegang heeft ze niet kan gebruiken , of je kunt file transfer encryption gebruiken om bestanden te coderen die zich via een netwerk verplaatsten, zoals bestanden die je online opslaat of download.

Cryptografische hashfuncties werken verschillend omdat de checksums niet bedoeld zijn om terug te draaien met een speciaal dehashing wachtwoord. Het enige doel van cryptografische hashfuncties dienen is twee stukken data te vergelijken, zoals wanneer je bestanden download, wachtwoorden opslaat en data uit een database haalt.

Het is mogelijk voor een cryptografische hashfunctie dezelfde checksum te produceren voor verschillende stukken data. Wanneer dit gebeurd heet dat een botsing, wat een groot probleem is, aangezien het hele punt van een cryptografische hashfunctie is om unieke checksums te maken voor elke data input.

Botsingen kunnen voorkomen omdat elke cryptografische hashfunctie een waarde produceert van een vaste lengte, ongeacht de ingevoerde data. Bijvoorbeeld, de MD5 cryptografische hashfunctie genereerd 827ccb0eea8a706c4c34a16891f84e7b, 1f633b2909b9c1addf32302c7a497983, en e10adc3949ba59abbe56e057f20f883e voor drie complete verschillende blokken data.

De eerste checksum is van 12345. De tweede was gegenereerd van meer dan 700 letters en nummers, en de derde is van 123456. Alle drie de inputs hebben verschillende lengtes, maar de resultaten blijven altijd 32 tekens hebben zolang MD5 was gebruikt.

Er is geen limiet aan het aantal checksums dat kan worden gemaakt omdat elke kleine verandering in de input een compleet andere checksum zou moeten produceren. Omdat er geen limiet voor het aantal checksums is dat één cryptografische hashfunctie kan produceren, is er altijd de mogelijk dat je een botsing tegenkomt.

Dat is de reden waarom andere cryptografische hashfuncties zijn gecreëerd. Terwijl MD5 een 32-tekens waarde genereerd, genereerd SHA-1 40 tekens en SHA-2 (512) genereerd er 128. Hoe groter het aantal tekens dat de checksum heeft, hoe kleiner de kans op een botsing.