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. De output wordt de hash, hashcode of digest van de input genoemd. Het is een vorm van pseudonimiseren. Het woord hash komt uit het Engels en betekent hier hakken.

Hashfuncties worden gebruikt in hashtabellen, cryptografie en dataverwerking. Bij een domein dat groter is dan het bereik is de functie uiteraard niet injectief, maar een goede hashfunctie is er een die in de praktijk weinig botsingen veroorzaakt in het domein waarmee ze werkt, dit wil zeggen dat er in de praktijk weinig tweetallen verschillende invoerwaarden voorkomen die dezelfde uitvoer geven. Afhankelijk van de toepassing van de hashfunctie moet deze ook zo zijn dat zo'n tweetal zelfs zeer moeilijk te vinden is als men er naar zou zoeken.

De SHA-familie van functies bestaat uit voorbeelden hiervan.

Cryptografische hash[bewerken]

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

Een cryptografisch veilige hashfunctie heeft de eigenschappen dat het niet mogelijk is om een blok gegevens te vinden dat een gegeven hashcode oplevert, of om twee verschillende blokken gegevens te vinden die dezelfde hashcode opleveren, mits de gegevensblokken niet te klein zijn (zodat ze allemaal geprobeerd kunnen worden). Voorwaarde is ook dat de hashcodes niet te klein zijn, want het proberen van evenveel blokken gegevens als het aantal mogelijke hashcodes levert gemiddeld één keer de gegeven hashcode op.

Voorbeelden van cryptografische hashalgoritmen zijn MD5 en de SHA-familie van hashfuncties. MD5 wordt echter tegenwoordig niet meer als cryptografisch veilig beschouwd. Voor SHA-1 is een theoretische aanval bekend, dus deze wordt ook afgeraden.

Hashing van wachtwoorden[bewerken]

Voor de aanmelding bij een computer zijn vaak een naam en een wachtwoord nodig. Van deze wachtwoorden wordt vaak alleen een one way hash opgeslagen, dat wil zeggen de output van een zodanige hashfunctie dat uit de hash niet het wachtwoord is af te leiden. Dat is ook niet nodig, aangezien het voldoende is te controleren of hash van het door de gebruiker opgegeven wachtwoord overeenkomt met de opgeslagen hash. Het voordeel is dat als het bestand met hashes door een onbevoegde gelezen wordt, deze er weinig aan heeft.

Hash-algoritmen voor wachtwoorden zijn onder meer bcrypt, scrypt en PBKDF. Hash-algoritmen die alleen zijn ontworpen om zo snel mogelijk berekend te kunnen worden zijn niet geschikt.

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. Bij hash-algoritmen voor wachtwoorden kan men dit tegengaan 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]