Hashing
Hashing is een proces dat data omzet naar een onomkeerbaar stuk tekst van een vaste lengte.
Hashing:
Produceert altijd dezelfde hash voor dezelfde input.
Is onomkeerbaar.
Je kan wel de originele data vinden door "brute force" alle mogelijke inputs om te zetten naar een hash en die dan te vergelijken.
Produceert altijd een hash van dezelfde lengte, ongeacht de lengte van de input.
Maakt een volledig andere hash voor zelfs een kleine verandering in de input.
Probeert te vermijden dat twee verschillende inputs dezelfde hash produceren.
Hashing vs Encryptie vs Encoding
Hashing, encryptie, en encoding hebben verschillende doelen en zijn niet hetzelfde.
Hashing | Encryptie | Encoding |
|---|---|---|
Onomkeerbaar | Omkeerbaar (met sleutel) | Omkeerbaar |
Vaste output lengte | Variabele output lengte | Variabele output lengte |
Gebruikt voor data-integriteit, wachtwoord opslag. | Gebruikt voor beschermen van data. | Gebruikt voor data in ander formaat te zetten. |
Hoe en waarom wordt hashing gebruikt?
Hashing wordt vaak gebruikt voor wachtwoord opslag en data-integriteit verificatie.
Wachtwoord opslag
Stel dat een gebruiker wil inloggen op een website.
De website heeft het wachtwoord niet opgeslagen, maar de hash van het wachtwoord wel.
Data-integriteit verificatie
Hashing wordt ook gebruikt om te verifiëren dat data niet is veranderd tijdens bv. overdracht of opslag.
Hashing algoritmes
Er zijn verschillende hashing algoritmes, elk is anders en beter of slechter voor verschillende toepassingen.
Data-integriteit algoritmes
Er bestaan veel algoritmes voor data-integriteit, zoals:
MD5: Vroeger veelgebruikt, maar nu verouderd.
SHA-1: Ook verouderd vanwege kwetsbaarheden.
SHA-256: Moderner en veiliger, veel gebruikt.
SHA-3: Nieuwste standaard, nog beter.
Wachtwoord hashing algoritmes
Wachtwoord hashing algoritmes zijn ontworpen om zwaar om te berekenen te zijn, zodat brute-forcing moeilijker wordt.
bcrypt: Modern en zwaar voor computers om te berekenen.
scrypt: Nog zwaarder dan bcrypt.
Argon2: Zeer modern en vaak de beste keuze.
Algoritmes zoals deze kunnen meerdere keren worden uitgevoerd (iteraties) om de berekeningstijd te verhogen.
Dit is de "cost factor".
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Deze wachtwoorden hashing algoritmes kunnen ook "salting" gebruiken.
Salting is het toevoegen van data aan het wachtwoord voordat het gehasht wordt.
Als resultaat van het wachtwoord en de salt krijgen we de hash "a1b2c3d4e5f6...".
Stel dat een aanvaller de database met hashes steelt en probeert een brute-force aanval zonder salt uit te voeren:
De aanvaller heeft het juiste wachtwoord "Wachtwoord123", maar weet dat niet want de hash komt niet overeen vanwege de salt.
Voorbeeld van bcrypt hash
Een bcrypt hash ziet er zo uit:
Hashing aanvallen
Een brute-force aanval is wanneer een aanvaller alle mogelijke combinaties probeert.
Om dit tegen te gaan kan je een goed hashing algoritme gebruiken en complexe wachtwoorden forceren.
Een dictionary aanval maakt gebruikt van een lijst van wachtwoorden die worden gehasht en vergeleken.
Werkt heel goed als het wachtwoord in de lijst staat, maar werkt niet als die er niet in staat.
Met salting werkt dit niet.
Een rainbow table is een vooraf berekende lijst van hashes en het toebehorende wachtwoord voor veelvoorkomende wachtwoorden.
Zo moet de aanvaller niet al die wachtwoorden opnieuw hashen waardoor veel tijd wordt gewonnen.
Als je salting gebruikt werkt het niet.
Een aanvaller kan proberen data aan te passen en dezelfde hash als resultaat te behouden.
Door moderne algoritmes te gebruiken is dit veel moeilijker.