Wat is hashen?

11 februari 2025

Hashing transformeert een invoer, vaak een bericht of stukje data genoemd, in een output met vaste grootte, bekend als een hashwaarde of berichtdigest. Het is een krachtig hulpmiddel om ervoor te zorgen data-integriteit, het beveiligen van wachtwoorden en het verifiรซren van de authenticiteit van documenten.

Wat is hashing?

Wat is hashing in simpele bewoordingen?

Hashing beschrijft een proces dat data van elke grootte of type neemt, deze invoert in een wiskundige functie die bekend staat als een hashfunctie, en een output van vaste grootte produceert. Een kleine wijziging in de input, zoals het veranderen van een enkele letter, verandert de output drastisch.

Goed ontworpen hashfuncties bieden ook weerstand tegen pogingen om de originele data te reverse-engineeren vanuit de hashwaarde. Deze eenrichtingseigenschap onderscheidt hashing van veel andere technieken in gegevensbeheer en beveiliging.

Soorten hashing

Hieronder staan โ€‹โ€‹verschillende soorten hashingtechnieken die vaak voorkomen in moderne computer- en beveiligingscontexten.

Cryptografische hashing

Cryptografische hashing is afhankelijk van gespecialiseerde algoritmen, zoals SHA-families (secure hash algorithm) of berichtensamenvattingsalgoritme 5 (MD5). Bij het kiezen van een hashing-algoritme geven ontwikkelaars en beveiligingsprofessionals vaak prioriteit aan collision resistance en resistance to reverse engineering. Veelvoorkomende eigenschappen zijn:

  • Voorafbeeldingsweerstand. Aanvallers kunnen de originele gegevens niet op basis van de hashwaarde bepalen.
  • Botsingsweerstand. Aanvallers kunnen onmogelijk twee verschillende invoeren vinden die dezelfde hash produceren.
  • Lawine-effect. Kleine veranderingen in de invoer zorgen voor dramatische verschillen in de uitvoer.

SHA-256, een lid van de SHA-2-familie, biedt een 256-beetje hash digest, waardoor het populair is voor taken variรซrend van wachtwoordbeveiliging tot filet integriteitscontroles.

Checksum-gebaseerde hashing

Checksums-gebaseerde methoden, zoals cyclische redundantiecontrole (CRC), richten zich op het detecteren van onbedoelde corruptie. CRC komt vaak voor in netwerkprotocollen en bestandsverificatieprocessen. Gebruikers controleren de checksum van een bestand om er zeker van te zijn dat er geen willekeurige fouten zijn opgetreden tijdens de transmissie. Hoewel checksums effectief omgaan met onbedoelde fouten, bieden ze zwakkere botsingsbestendigheid dan cryptografische hashes en minimale beveiliging tegen opzettelijke manipulatie.

Rollende hasj

Rolling hash-algoritmen, zoals Rabin-Karp, bieden efficiรซnte updates van hash-waarden wanneer slechts kleine segmenten van de onderliggende data veranderen. Dit voordeel maakt rolling hashes nuttig in string-search-algoritmen, diff-tools en elke context met een schuivend venster over data. Wanneer een enkel teken of blok verschuift, berekent een rolling hash-algoritme de nieuwe hash snel opnieuw in plaats van opnieuw vanaf nul te berekenen.

Hashing voor datastructuren

Gegevensstructuren gebruiken vaak hashing om snel invoegen, opzoeken en verwijderen mogelijk te maken. Hashtabellen of associatieve arrays zetten een sleutel (zoals een string) om in een index in een array, waar de daadwerkelijke gegevens zich bevinden. Deze gegevensstructuren vertrouwen op het verwerken van botsingen via methoden zoals afzonderlijke ketening (het opslaan van botsende elementen in een gekoppelde lijst) of open adressering (het verkennen van alternatieve array-indices). Programmeertalen als Java, Pythonen C + + bevatten hash-gebaseerde containers, waardoor ontwikkelaars efficiรซnte algoritmen kunnen implementeren.

Hashing-voorbeeld

Beschouw de string โ€œHello.โ€ Een veelgebruikte cryptografische hashfunctie, zoals SHA-256, verwerkt โ€œHelloโ€ en levert een hexadecimale digest met vaste lengte op. Een veelgenoemd voorbeeld van een SHA-256-digest voor โ€œHelloโ€ ziet er als volgt uit:

  • 185F8DB32271FE25F561A6FC938B2E264306EC304EDA518007D1764826381969

Als de invoer verandert in "hello" (kleine "h"), verandert de resulterende SHA-256-digest volledig. Deze gevoeligheid voor kleine wijzigingen benadrukt waarom hashing helpt bij het detecteren van wijzigingen in invoergegevens.

Hoe werkt hashing?

Hash-functies volgen een gestructureerd proces om een โ€‹โ€‹invoer om te zetten in een hash-digest met vaste grootte. Hoewel de interne werking verschilt tussen specifieke algoritmen, omvatten de algemene stappen:

1. Gegevensparseren

De meeste hashing-algoritmen beginnen met het splitsen van de invoergegevens in blokken met een vaste grootte. SHA-256 gebruikt bijvoorbeeld 512-bits (64-bits)byte) blokken, terwijl SHA-512 blokken van 1024 bit (128 bytes) gebruikt. Grotere invoer wordt eenvoudigweg in meerdere iteraties verwerkt. Wanneer de invoer niet perfect in een geheel aantal blokken past, passen hashfuncties padding toe om de invoer uit te breiden tot een exacte blokgrens. Veelvoorkomende paddingbenaderingen, zoals die in Merkle-Damgรฅrd-constructies, voegen toe:

  • Een enkele '1'-bit.
  • Genoeg '0' bits om de gewenste lengte te bereiken.
  • Een lengteveld dat de grootte van het oorspronkelijke bericht in bits codeert.

Deze opvulling zorgt ervoor dat het algoritme alle gegevens op uniforme wijze verwerkt en dat het uiteindelijke blok essentiรซle lengte-informatie bevat voor botsingsbestendigheid.

2. Initiรซle staat instellen

Hash-functies gebruiken een set interne statusvariabelen, soms ook wel chaining-variabelen of registers genoemd. Algoritmeontwerpers definiรซren deze beginstatuswaarden als constanten, waarmee de deterministische aard van de functie wordt gewaarborgd. Een bekend voorbeeld is SHA-256, dat acht 32-bits woorden initialiseert. Deze woorden komen voort uit specifieke fractionele delen van de vierkantswortels van priemgetallen (2, 3, 5, 7, enz.), gekozen vanwege hun distributie-eigenschappen en om het risico op verborgen zwakheden te minimaliseren.

Elke keer dat een hashing-proces begint, keert de status terug naar deze initiรซle constanten. De functie werkt vervolgens de status bij elke iteratie bij, zodat deze "onthoudt" hoe eerdere blokken de hashwaarde hebben beรฏnvloed. Zonder een gestandaardiseerde initiรซle status zouden verschillende implementaties van hetzelfde algoritme inconsistente resultaten genereren.

3. Compressiefunctie

De compressiefunctie vormt de kern van het hash-algoritme. Het verwerkt elk datablok naast de huidige interne status om een โ€‹โ€‹nieuwe interne status te produceren. Cryptografische hashfuncties vertrouwen op combinaties van bewerkingen, waaronder:

  • Bitgewijze bewerkingen (AND, OR, XOR). Deze bewerkingen werken op bitniveau en creรซren diffusie. Kleine veranderingen in de bits van een blok leiden tot grote veranderingen in de output.
  • Modulaire uitbreidingen. Veel algoritmen voegen rondespecifieke constanten toe en blokkeren data modulo 2^32 (of 2^64, afhankelijk van de variant). Modulaire rekenkunde verhaspelt de data verder en vermindert voorspelbare patronen.
  • Rotaties of verschuivingen. Bij circulaire rotatie (ROTR, ROTL) en verschuivingen naar rechts/links worden bits gemengd en wordt het lawine-effect versterkt. Hierdoor worden variaties van รฉรฉn bit in de invoer door meerdere bits in de uitvoer voortgeplant.
  • Afgeronde constanten. Elke iteratie omvat vaak unieke constanten, waardoor het risico op herhalende patronen die aanvallers kunnen misbruiken, wordt verkleind.

Ontwikkelaars rangschikken deze bewerkingen in meerdere ronden binnen de compressiefunctie. SHA-256 gebruikt bijvoorbeeld 64 ronden per 512-bits blok, elk met een mix van toevoegingen, rotaties en logische functies (zoals Ch, Maj, ฮฃ en ฯƒ). Elke ronde neemt de uitvoer van de vorige ronde als invoer, waardoor elke kleine wijziging in het invoerbericht wordt verspreid over de hashstatus tijdens volgende ronden.

4. Afronding

De finalisatiefase neemt de laatste bijgewerkte interne status en produceert de definitieve hash-digest. Merkle-Damgรฅrd-gebaseerde ontwerpen (zoals MD5, SHA-1 en SHA-2) vertrouwen vaak op de iteratieve samendrukking structuur en voeg lengte-informatie toe in het laatste blok. Op spons gebaseerde ontwerpen (zoals SHA-3) gebruiken een ander proces genaamd "absorberen" en "knijpen", maar ze bereiken een vergelijkbaar einddoel: een output met een vaste grootte die elk stukje van de input weerspiegelt.

Veel hash-algoritmen geven het resultaat uit in een handig formaat, zoals een hexadecimale tekenreeks (bijvoorbeeld 64 hexadecimale tekens voor een 256-bits hash). Afhankelijk van het algoritme kan de digest ook verschijnen in Base64, raw binary of een andere codering. Op beveiliging gerichte ontwerpen zorgen ervoor dat de uiteindelijke digest niet kan worden gebruikt om de oorspronkelijke gegevens te herstellen, waardoor hashing een eenrichtingsfunctie is in plaats van een encryptie mechanisme.

Waarom hebben we hashing nodig?

Hashing maakt verschillende cruciale beveiligings- en databeheerfuncties mogelijk. Hieronder staan โ€‹โ€‹de belangrijkste redenen voor het belang ervan.

Data-integriteit

Gebruikers en systemen verifiรซren de integriteit van gegevens door een bekende hashwaarde te vergelijken met de hashwaarde van de betreffende gegevens. Een verschil in hashwaarden geeft aan dat de gegevens zijn gewijzigd, hetzij per ongeluk of met kwade bedoelingen.

Wachtwoordbeveiliging

websites en toepassingen gebruikerswachtwoorden opslaan als hashes in plaats van platte tekst. Wanneer een gebruiker inlogt, hasht het systeem het opgegeven wachtwoord en controleert het met de opgeslagen hash. Als ze overeenkomen, krijgt de gebruiker toegang. Aanvallers die gehashte wachtwoorden stelen, hebben een veel moeilijkere taak dan ze zouden hebben met een platte tekstwachtwoordlijst.

Bestandsverificatie

Veel downloads bevatten een referentiehash. Na het downloaden genereren gebruikers de hash van het bestand en vergelijken deze met de opgegeven referentie. Als beide overeenkomen, is het bestand waarschijnlijk intact aangekomen zonder te knoeien of corruptie.

Digitale handtekeningen

Digitale handtekeningen vertrouwen op hashing om een โ€‹โ€‹samenvatting van grote documenten te genereren. De ondertekenaar gebruikt een privรฉsleutel om de hash te ondertekenen, wat een handtekening oplevert die ontvangers kunnen verifiรซren met de openbare sleutel. Ontvangers hashen het document vervolgens zelf om te bevestigen dat het overeenkomt met de ondertekende hash.

ontdubbeling

Opslagsystemen identificeren dubbele bestanden door hashwaarden te onderzoeken. Als twee bestanden dezelfde hash produceren, worden ze behandeld als potentiรซle duplicaten, wat aanzienlijke opslagruimte bespaart wanneer grote bestanden zich herhalen.

Hoe maak je een hash?

Het maken van een hash omvat het selecteren van een geschikt algoritme, het toepassen ervan op de data en het lezen van de gegenereerde digest. Hieronder staat het typische proces:

1. Kies een hash-algoritme

Bepaal uw beveiligings- en prestatiebehoeften voordat u een algoritme selecteert. Voor robuuste beveiliging leveren algoritmen zoals SHA-256 of SHA-3 een sterke botsingsbestendigheid. Voor eenvoudigere foutcontroledoeleinden zijn algoritmen zoals CRC-32 vaak voldoende.

2. Gebruik een hashingtool of bibliotheek

De meeste besturingssystemen ingebouwde opdrachten of hulpprogramma's voor hashing bevatten. Bijvoorbeeld, een Linux of macOS-gebruikers kunnen typen:

  • shasum -a 256 voorbeeld.txt

Windows-gebruikers vertrouwen vaak op certutil:

  • certutil -hashfile voorbeeld.txt SHA256

Programmeertalen bieden ook bibliotheken voor hashing. De hashlib-module van Python of de MessageDigest-klasse van Java bieden programmatische functies om hashes binnen applicaties te genereren.

3. Leg het resultaat vast

De tool of bibliotheek geeft een digest uit, meestal als een hexadecimale string. De lengte van deze string is afhankelijk van het algoritme: SHA-256 produceert 64 hexadecimale tekens, SHA-1 produceert 40, enzovoort.

Waarom is hashing belangrijk?

Hashing ligt ten grondslag aan data security en efficiรซntie in talloze systemen. Dit zijn de voordelen van hashing:

  • Beveiliging tegen manipulatie. Met hashwaarden kunnen gebruikers detecteren of iemand een stukje data heeft gewijzigd. Door de hash opnieuw te berekenen en deze te vergelijken met een bekende, vertrouwde waarde, kan iedereen bevestigen dat de data intact is gebleven.
  • Efficiรซnte verificatie. Integriteit verifiรซren met een hash is veel sneller dan het lezen en vergelijken van hele bestanden. Systemen die grote datasets moeten vergelijken of verifiรซren, hebben aanzienlijk baat bij het controleren van hashwaarden.
  • Vertrouw op gedistribueerde systemen. Gedistribueerde omgevingen zoals peer-to-peer-netwerken en blockchainplatforms vertrouwen op hashwaarden om bestanden, transacties of datablokken te valideren. Elke deelnemer bevestigt de juistheid door hashes te berekenen en te vergelijken, waardoor het risico op het accepteren van corrupte data wordt verminderd.
  • Bescherming van gevoelige gegevens. Door wachtwoorden op te slaan als hashes in plaats van platte tekst, wordt snelle diefstal van gebruikersreferenties voorkomen. Aanvallers die een databank zie hashes in plaats van de originele wachtwoorden. Systeemontwikkelaars voegen vaak salts (willekeurige strings toegevoegd aan het wachtwoord) toe om verdere weerstand te bieden aanvallen met brute kracht.

Hashing versus encryptie

Hashing produceert een vaste-grootte digest van een invoer op een manier die niet kan worden teruggedraaid met een geheime sleutel. Encryptie transformeert gegevens in een onleesbare vorm, maar geautoriseerde ontvangers kunnen een sleutel gebruiken om dat proces terug te draaien en de originele platte tekst op te halen.

Hashing is bedoeld om de integriteit en authenticiteit van gegevens te verifiรซren, terwijl encryptie zorgt voor vertrouwelijkheid en gecontroleerde toegang tot leesbare gegevens.

Veelgestelde vragen over hashen

Hieronder vindt u enkele veelgestelde vragen over hashing.

Hoe vind ik een hashwaarde?

Gebruikers kiezen doorgaans een algoritme en gebruiken een hashingtool of bibliotheek om gegevens in het algoritme te voeden. Op Linux of macOS biedt de opdracht shasum -a 256 een eenvoudige manier om een โ€‹โ€‹SHA-256-hash te genereren.

Op Windows voert certutil -hashfile example.txt SHA256 een vergelijkbare taak uit. Programmeertalen omvatten bibliotheken zoals Python's hashlib, waarmee ontwikkelaars hashwaarden in code kunnen berekenen.

Kun je hash omkeren?

Er bestaat geen haalbare methode om een โ€‹โ€‹cryptografische hash om te keren. Hashfuncties laten elk ingebouwd mechanisme om de originele data te herstellen weg. Aanvallers moeten de input raden of brute forceren en de output vergelijken met de beoogde hash, wat extreem moeilijk wordt voor grote of complexe inputs.

Daarentegen is bij encryptie omkering met een sleutel mogelijk, waardoor hashing en encryptie fundamenteel verschillende processen zijn.


Nikola
Kosti
Nikola is een doorgewinterde schrijver met een passie voor alles wat met hightech te maken heeft. Na het behalen van een graad in journalistiek en politieke wetenschappen, werkte hij in de telecommunicatie- en onlinebanksector. Schrijft momenteel voor phoenixNAP, hij is gespecialiseerd in het oplossen van complexe vraagstukken over de digitale economie, e-commerce en informatietechnologie.