Hashfunctie

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

Een hashfunctie of klutsfunctie is een functie in de informatica die invoer uit een breed domein van waarden omzet in een (meestal) kleiner bereik, meestal een deelverzameling van de gehele getallen. Het woord hash komt uit het Engels en betekent hier hakken.

Hashfuncties worden gebruikt in hashtabellen, cryptografie en dataverwerking. Een goede hashfunctie is er een die weinig botsingen veroorzaakt in het domein waarmee ze werkt, dit wil zeggen dat er weinig kans is dat twee verschillende invoerwaarden dezelfde uitvoer geven.

Formeel betekent dit dat een goede hashfunctie H de eigenschap heeft dat uit H(x) = H(y) volgt dat het zeer waarschijnlijk is dat x = y.

Een voorbeeld hiervan zijn de SHA-familie van functies.

Cryptografische hash[bewerken]

1rightarrow blue.svg Zie Encryptie#Hashing voor het hoofdartikel over dit onderwerp.

Voor een cryptografische hashfunctie geldt niet alleen dat het voor twee toevallige waarden x en y zeer onwaarschijnlijk is dat H(x) = H(y), maar ook dat iemand die bewust op zoek gaat naar zulke waarden ze niet zal kunnen vinden. Een cryptografisch veilige hashcode heeft de eigenschappen dat het niet mogelijk is om te achterhalen van welk blok gegevens de bepaalde code is afgeleid en dat het onmogelijk is om twee verschillende blokken gegevens te maken die dezelfde hashcode hebben. Hierdoor heeft een cryptografisch veilige hashcode de eigenschappen van een digitale 'vingerafdruk'.

Voorbeelden van cryptografische hashalgoritmen zijn MD5 en de SHA-familie van hashfuncties. MD5 wordt echter tegenwoordig niet meer als cryptografisch veilig beschouwd.

Hashing van wachtwoorden[bewerken]

Voor de aanmelding bij een computer zijn vaak een naam en een wachtwoord nodig. Deze wachtwoorden worden vaak versleuteld opgeslagen, zodat de wachtwoorden niet bekend worden als het bestand met wachtwoorden door een onbevoegde gelezen wordt. Dit gebeurt door middel van een hashing-algoritme, dat het onmogelijk maakt de versleutelde gegevens te decoderen. Dat is ook niet nodig, aangezien het voldoende is te controleren of de gebruiker het juiste wachtwoord heeft opgegeven.

Bij het versleutelen van wachtwoorden is het echter onveilig om gebruik te maken van algemene hash-algoritmen, en dient gebruik te worden gemaakt van speciale hash-algoritmen voor wachwoorden zoals bcrypt, scrypt, of PBKDF. De reden is dat normale hash-algoritmen zijn ontworpen om zo snel mogelijk berekend te kunnen worden. Bij het hashen van wachtwoorden is dat onwenselijk, omdat het daardoor mogelijk wordt dat iemand die de hashcodes van de wachtwoorden in bezit heeft gekregen achterhaalt welke hashcode van welk wachtwoord is afgeleid.

De lengte en complexiteit van wachtwoorden die mensen in de praktijk gebruiken is beperkt, terwijl computers steeds sneller worden. Daardoor wordt het voor iemand die probeert hashcodes voor wachtwoorden te kraken steeds makkelijker om een computer allerlei mogelijkheden te laten uitproberen. Hash-algoritmen voor wachtwoorden blokkeren deze methode doordat voor deze algoritmen in te stellen is hoeveel rekentijd ze moeten kosten. De algoritmen worden dan zo ingesteld dat het uitrekenen ervan bijvoorbeeld één milliseconde kost, terwijl het berekenen van een hashcode met een gewoon hash-algoritme minder dan een microseconde kan kosten. Bij het controleren van een wachtwoord is het meestal geen probleem als dit een milliseconde in plaats van een microseconde kost, terwijl iemand die wil proberen de hashcodes te kraken meer dan duizend keer zo veel rekenwerk moet doen, en dus meer dan duizend keer langer bezig is.

Zie ook[bewerken]