Ga naar inhoud
HexaTransfer
Terug naar blog
Encryptie & beveiliging

Hashfuncties uitgelegd: bestandsintegriteit eenvoudig verifiëren

Hashfuncties zijn essentieel voor integriteitsverificatie na overdracht. Hoe SHA-256 en MD5 ervoor zorgen dat bestanden ongewijzigd aankomen.

Een hashfunctie neemt elke invoer en produceert een uitvoer van vaste grootte — SHA-256 spuugt altijd precies 256 bits (32 bytes) uit, ongeacht of de invoer een tweet is of een video van 10 GB. Verander één bit van de invoer, en ruwweg de helft van de uitvoerbits flipt. Deze eenrichtings-, deterministische eigenschap maakt hashes het standaardhulpmiddel voor het verifiëren van bestandsintegriteit: bereken SHA-256(bestand) voor verzending, bereken het opnieuw na ontvangst, en als de hashes overeenkomen, is het bestand intact aangekomen. Zo verifiëren Linux-distributies ISO-downloads, zo identificeert Git commits en zo bevestigen diensten als HexaTransfer dat uploads van meerdere gigabytes volledig zonder corruptie worden voltooid.

Wat een hashfunctie garandeert

Drie eigenschappen definiëren een cryptografische hashfunctie:

  • Deterministisch. Dezelfde invoer produceert altijd dezelfde uitvoer. SHA-256("hallo") is altijd 2cf24dba5fb0a30e....
  • Pre-image-weerstand. Gegeven een hash, kun je niet efficiënt een invoer vinden die die produceert.
  • Botsingsbestendigheid. Je kunt niet efficiënt twee verschillende invoerwaarden vinden die dezelfde hash produceren.

Plus twee nuttig gedrag:

  • Lawinaeffect. Het wijzigen van één invoerbit flipt ruwweg 50% van de uitvoerbits. Maakt hashes nutteloos voor zoeken maar geweldig voor vingerafdrukken.
  • Vaste uitvoergrootte. SHA-256 is 32 bytes, SHA-512 is 64 bytes, BLAKE2b is 64 bytes, ongeacht de invoergrootte.

Hashes zijn geen versleuteling. Ze zijn eenrichtings — je kunt de invoer niet herstellen uit de uitvoer. Dat is de bedoeling.

De SHA-familie

De Secure Hash Algorithm-familie, gestandaardiseerd door NIST in FIPS 180-4 en FIPS 202:

  • SHA-1 — 160 bits, gebroken door Google's SHAttered-aanval in 2017. Gebruik dit niet voor beveiliging.
  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512). Het werkpaard van moderne systemen. SHA-256 domineert.
  • SHA-3 (Keccak). Andere constructie (spons, niet Merkle-Damgård), gestandaardiseerd in 2015 als afdekking tegen SHA-2-zwakheden die zich niet hebben gematerialiseerd.

SHA-256 is wat TLS-certificaten ondertekenen, wat Bitcoin mijnt, wat Git gebruikt (met een geplande SHA-256-overgang nog in uitvoering), en wat bestandsoverdrachtsservices berekenen voor integriteitscontroles. Doorvoer op moderne CPU's met SHA-extensies: 2–4 GB/s per kern.

Waarom MD5 en SHA-1 dood zijn voor beveiliging

MD5 (1991) produceert 128-bits hashes en was de standaard totdat botsingen werden aangetoond in 2004. In 2012 smeedde de Flame-malware Microsoft-codeondertekenancertificaten met een MD5-botsingsaanval. Vandaag de dag kun je MD5-botsingen in seconden op een laptop genereren.

SHA-1 duurde langer maar viel door Google's SHAttered-aanval in 2017, die twee PDF's produceerde met identieke SHA-1-hashes na 110 GPU-jaren berekening — nu reproduceerbaar voor minder dan €100.000 op cloud-GPU's.

Beide zijn prima voor niet-beveiligingsgebruik: accidentele corruptie detecteren, opslag dedupliceren, cache-sleutels vingerafdrukken. Ze zijn niet geschikt voor digitale handtekeningen, wachtwoordverificatie of iets waarbij een aanvaller profiteert van het vervalsen van een overeenkomst.

BLAKE2 en BLAKE3: snelheid ontmoet beveiliging

BLAKE2 (2012) en BLAKE3 (2020) bieden SHA-3-niveau beveiliging bij 2–10x de snelheid van SHA-256. BLAKE3 haalt ruwweg 6 GB/s single-threaded en schaalt lineair over kernen — een 16-kern machine kan 100+ GB/s halen.

Adoptie groeit: WireGuard gebruikt BLAKE2s voor authenticatie, Zcash gebruikt BLAKE2b en b3sum wordt een veelgebruikte vervanging voor sha256sum in ontwikkelaarsgereedschappen. Bestandsoverdrachtsservices die uploads van meerdere gigabytes verwerken, gebruiken steeds vaker BLAKE3 om te voorkomen dat hashberekening de bottleneck wordt.

Browsers stellen BLAKE3 nog niet beschikbaar via de Web Crypto API, dus JavaScript-implementaties vertrouwen op WASM-gecompileerde referentiecode op ruwweg 500 MB/s in de browser.

Hashes in bestandsoverdrachtsworkflows

Verschillende plaatsen waar hashes hun waarde bewijzen:

  • Integriteitscontrole na upload. Client berekent SHA-256 tijdens upload, server berekent bij aankomst, discrepanties activeren herpload. S3 gebruikt MD5 hiervoor omdat snelheid belangrijker is dan botsingsbestendigheid tegen passieve corruptie.
  • Verificatie van gesegmenteerde upload. Grote bestanden gesplitst in blokken van 4 MB of 5 MB; elk blok krijgt een hash, en een boom van hashes (Merkle-boom) produceert één wortelhash voor het hele bestand.
  • Deduplicatie. Als twee gebruikers hetzelfde bestand uploaden, komen hashes overeen, sla opslag één keer op. Gebruikt door de blokniveaudeduplicatie van Dropbox en CDN-caching.
  • Downloadverificatie. Sommige diensten tonen de SHA-256 op de downloadpagina zodat ontvangers kunnen verifiëren.
  • Versie-identificatie. Git gebruikt SHA-1 (migreert naar SHA-256) voor commit-ID's — de inhoud van een bestand bepaalt zijn identiteit.

De HMAC-uitbreiding

Gewone hashes kunnen integriteit maar niet authenticiteit verifiëren — iedereen kan SHA-256(bestand) berekenen. Het toevoegen van een geheime sleutel maakt een hash een Message Authentication Code (MAC): alleen iemand met de sleutel kan de MAC produceren of verifiëren.

HMAC (RFC 2104) is de standaardconstructie: HMAC(sleutel, bericht) = SHA-256(sleutel' ⊕ opad || SHA-256(sleutel' ⊕ ipad || bericht)). Gebruikt in TLS 1.2, JWTs ondertekend met HS256, AWS-verzoekondertekening en veel sessiecookieschema's.

Voor bestandsoverdracht verschijnt HMAC in de authenticatietag van AES-GCM (die GHASH gebruikt, niet HMAC, maar dezelfde rol vervult) en in de API-verzoekondertekening van sommige diensten.

Merkle-bomen: hashen op schaal

Voor zeer grote bestanden of verzamelingen van bestanden is het elke keer hashen van het geheel verspillend. Een Merkle-boom rangschikt hashes in een binaire boom: bladeren zijn blokhashes, interne knooppunten zijn hashes van hun kinderen, de wortelhash vertegenwoordigt de gehele dataset.

Voordelen:

  • Efficiënte updates. Het wijzigen van één blok vereist slechts het opnieuw hashen van log(n) knooppunten.
  • Bewijs van opname. Je kunt bewijzen dat een specifiek blok deel uitmaakt van de wortel met slechts log(n) broer-of-zus-hashes.
  • Parallelle berekening. Takken hashen onafhankelijk.

Gebruikt door BitTorrent (post-v2), IPFS-inhoudsadressering, Git's boomdjecten, certificaattransparantielogboeken en blockchain-transactieroots. Bestandsoverdrachtsservices gebruiken Merkle-bomen voor hervatteerbare uploads waarbij gedeeltelijke uploads moeten worden geverifieerd tegen het origineel.

Wachtwoorden en hashes

Een toepassing voor hashes: wachtwoorden omzetten naar veilig opslagbare waarden. Naïeve SHA-256(wachtwoord) is onvoldoende — GPU-boerderijen berekenen miljarden SHA-256 per seconde, dus elk veelgebruikt wachtwoord valt onmiddellijk.

Wachtwoordspecifieke hashes voegen rekenkosten toe:

  • PBKDF2-HMAC-SHA-256 met 600.000 iteraties (OWASP 2023).
  • bcrypt met kostenfactor 12 (ruwweg 250 ms per hash).
  • scrypt met geheugenmoeilijkheid om GPU's te weerstaan.
  • Argon2id — huidige beste praktijk, geheugenmoeilijk en paralleliteitsbestendig.

Het doel is niet beveiliging via de hash zelf — het is elke gissing duur genoeg maken zodat offline brute force onpraktisch wordt voor alles behalve zwakke wachtwoorden.

Een download handmatig verifiëren

Elk bestand waar je om geeft, kan worden geverifieerd met commandoregelgereedschappen. Op macOS of Linux:

shasum -a 256 ubuntu-24.04.iso

Op Windows PowerShell:

Get-FileHash ubuntu-24.04.iso -Algorithm SHA256

Vergelijk de uitvoer met de gepubliceerde hash op ubuntu.com. Als ze overeenkomen, is het bestand intact gedownload en overeenkomt met wat Canonical heeft ondertekend. Als ze verschillen, is de download beschadigd of heeft iemand het bestand verwisseld.

Voor maximaal vertrouwen, verifieer de handtekening op het hashbestand zelf met GPG en de ondertekeningssleutel van Canonical. De meerstaps keten — ondertekend hashbestand → bestandshash → bestand — is hoe Linux-distributies al decennia vertrouwen handhaven.

De integriteitsafhandeling van een overdrachtsservice controleren

Vier vragen die elke bestandsoverdrachtsaanbieder waard zijn:

  • Welk hashalgoritme gebruik je om uploads te verifiëren? (SHA-256 of BLAKE3 zijn prima; MD5 is aanvaardbaar voor corruptiecontroles alleen; stilte is een gele vlag.)
  • Toon je de hash aan de ontvanger? (Niet alle doen dat, maar het is prettig.)
  • Gebruik je Merkle-bomen voor gesegmenteerde uploads?
  • Is er een manier om hashes over eindpunten te vergelijken?

SwissTransfer, Tresorit, Proton Drive en HexaTransfer berekenen allemaal SHA-256 tijdens overdracht en verifiëren bij aankomst. Integriteitsfouten activeren automatisch herpload van getroffen blokken in plaats van de hele overdracht te mislukken.

Toepassen in de praktijk

Voor je volgende gevoelige overdracht: bereken shasum -a 256 bestand.pdf voor upload, bewaar de hash, en laat de ontvanger hetzelfde doen na het downloaden. Overeenkomende hashes bewijzen byte-voor-byte integriteit. Het is 30 seconden werk dat corruptie, manipulatie en de occasionele verkeerd geconfigureerde CDN detecteert.

Probeer het op hexatransfer.com — gratis, zonder account, tot 10 GB.

Verstuur grote bestanden veilig met end-to-end-versleuteling

Draag bestanden tot 10 GB gratis over met end-to-end-versleuteling. Geen account nodig. Uw bestanden worden in uw browser versleuteld voordat ze worden geüpload — niemand anders kan ze lezen.

Een bestand verzenden