Wat is hashen?

11 februari 2025

Hashing zet een invoer, vaak een bericht of stukje data genoemd, om in een uitvoer van vaste grootte, bekend als een hashwaarde of berichtsamenvatting. Het is een krachtig hulpmiddel om de integriteit van gegevens te waarborgen , wachtwoorden te beschermen en de authenticiteit van documenten te verifiëren.

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 oorspronkelijke gegevens uit de hashwaarde te achterhalen. Deze eenrichtingseigenschap onderscheidt hashing van veel andere technieken voor gegevensbeheer en -beveiliging.

Soorten hashing

Hieronder staan ​​verschillende soorten hashingtechnieken die vaak voorkomen in moderne computer- en beveiligingscontexten.

Cryptografische hashing

Cryptografische hashing is gebaseerd op gespecialiseerde algoritmen , zoals de SHA-familie (Secure Hash Algorithm) of het Message Digest Algorithm 5 (MD5) . Bij de keuze van een hashing-algoritme geven ontwikkelaars en beveiligingsprofessionals vaak prioriteit aan botsingsbestendigheid en weerstand tegen reverse engineering. Veelvoorkomende eigenschappen zijn onder andere:

  • 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 hash-digest van 256 bits , waardoor het populair is voor taken variërend van wachtwoordbeveiliging tot bestandsintegriteitscontroles.

Checksum-gebaseerde hashing

Op checksums gebaseerde methoden, zoals de 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 het geen willekeurige fouten heeft ondergaan tijdens de overdracht. Hoewel checksums onbedoelde fouten effectief afhandelen, bieden ze een 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

Datastructuren maken vaak gebruik van hashing om snelle invoeging, opzoeking en verwijdering mogelijk te maken. Hash-tabellen of associatieve arrays zetten een sleutel (zoals een tekenreeks) om in een index in een array, waar de daadwerkelijke gegevens zich bevinden. Deze datastructuren zijn gebaseerd op het afhandelen van botsingen via methoden zoals separate chaining (het opslaan van botsende elementen in een gekoppelde lijst) of open addressing (het verkennen van alternatieve array-indexen). Programmeertalen zoals Java , Python en 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 hash-algoritmen beginnen met het opsplitsen van de invoergegevens in blokken van vaste grootte. SHA-256 gebruikt bijvoorbeeld blokken van 512 bits (64 bytes ), terwijl SHA-512 blokken van 1024 bits (128 bytes) gebruikt. Grotere invoergegevens worden 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. Gangbare padding-methoden, zoals die in Merkle-Damgård-constructies, voegen het volgende 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 gebruikt de laatst bijgewerkte interne status om de uiteindelijke hash-digest te genereren. Ontwerpen gebaseerd op Merkle-Damgård (zoals MD5, SHA-1 en SHA-2) maken vaak gebruik van de iteratieve compressiestructuur en voegen lengte-informatie toe aan het laatste blok. Ontwerpen gebaseerd op Sponge (zoals SHA-3) gebruiken een ander proces genaamd "absorberen" en "comprimeren", maar bereiken een vergelijkbaar einddoel: een uitvoer van vaste grootte die elk bit van de invoer weerspiegelt.

Veel hash-algoritmen geven het resultaat weer in een handig formaat, zoals een hexadecimale tekenreeks (bijvoorbeeld 64 hexadecimale tekens voor een 256-bits hash). Afhankelijk van het algoritme kan de hash ook in Base64, ruwe binaire vorm of een andere codering verschijnen. Beveiligingsgerichte ontwerpen zorgen ervoor dat de uiteindelijke hash niet kan worden gebruikt om de oorspronkelijke gegevens te herstellen, waardoor hashing eenrichtingsverkeer is in plaats van een encryptiemechanisme.

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 applicaties slaan gebruikerswachtwoorden op als hashes in plaats van in platte tekst. Wanneer een gebruiker inlogt, hasht het systeem het ingevoerde wachtwoord en vergelijkt dit met de opgeslagen hash. Als deze overeenkomen, krijgt de gebruiker toegang. Aanvallers die gehashte wachtwoorden stelen, hebben het veel moeilijker dan wanneer ze een lijst met wachtwoorden in platte tekst zouden stelen.

Bestandsverificatie

Veel downloads bevatten een referentiehash. Na het downloaden genereren gebruikers de hash van het bestand en vergelijken deze met de opgegeven referentiehash. Als beide overeenkomen, is het bestand waarschijnlijk intact aangekomen en niet gemanipuleerd of beschadigd.

Digitale handtekeningen

Digitale handtekeningen maken gebruik van hashing om een ​​samenvatting van grote documenten te genereren. De ondertekenaar gebruikt een privésleutel om de hash te ondertekenen, waardoor een handtekening ontstaat die ontvangers kunnen verifiëren met de publieke sleutel. Ontvangers hashen vervolgens zelf het document om te bevestigen dat het overeenkomt met de ondertekende hash.

ontdubbeling

Opslagsystemen identificeren dubbele bestanden door hashwaarden te controleren. Als twee bestanden dezelfde hashwaarde opleveren, worden ze beschouwd als potentiële duplicaten, waardoor aanzienlijke opslagruimte wordt bespaard 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 bevatten ingebouwde commando's of hulpprogramma's voor hashing. Een Linux- of macOS-gebruiker zou bijvoorbeeld het volgende 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.