Bcrypt vs Argon2: welke wachtwoord-hash in 2026

Bcrypt en Argon2 zijn de twee meest gebruikte wachtwoord-hashfuncties van vandaag. Beide zijn ontworpen om traag te zijn en bestand tegen brute-force-aanvallen, in tegenstelling tot MD5 of SHA-256 die per definitie snel zijn. Argon2 won de Password Hashing Competition in 2015 en is nu de door OWASP aanbevolen keuze voor nieuwe toepassingen. Bcrypt blijft een uitstekende, volwassen en breed ondersteunde optie. Dit artikel legt de verschillen precies uit om je te helpen kiezen.

Waarom een wachtwoord-hash anders is

Een klassieke cryptografische hash zoals SHA-256 is ontworpen om snel te zijn: men wil gigabytes aan data per seconde hashen. Voor wachtwoorden is die eigenschap juist een nadeel: een aanvaller die jouw gebruikerstabel buitmaakt, kan miljarden wachtwoorden per seconde testen op een GPU. Een wachtwoord-hashfunctie (PHF, password hashing function) streeft daarentegen naar:

  • Traag per ontwerp, met een instelbare kostparameter
  • Gezouten, om rainbow tables en parallelle aanvallen op meerdere accounts te voorkomen
  • Bestand tegen gespecialiseerde hardware (GPU, FPGA, ASIC) om de speedup voor de aanvaller te beperken

Het zout en de kostparameter worden samen met de hash opgeslagen, in een unieke string meestal van de vorm $algo$params$zout$hash. Daardoor kan de kost in de loop van de tijd worden verhoogd zonder dat oude hashes onmiddellijk moeten worden gemigreerd.

Bcrypt: 1999, Blowfish, cost-parameter

Bcrypt is in 1999 ontworpen door Niels Provos en David Mazières voor OpenBSD. Het is gebaseerd op het Blowfish-versleutelingsalgoritme, waarvan het de hoge initialisatiekost van de tabellen benut. Bcrypt biedt slechts één parameter, cost (of rounds), die het aantal iteraties bepaalt in de vorm 2^cost. Cost met 1 verhogen verdubbelt de rekentijd.

Typisch uitvoerformaat:

$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
 |  |  |                      |
 |  |  cost = 12               zout + hash in base64
 |  variant (2y = openbsd)
 algo bcrypt

Bcrypt beperkt de invoer tot 72 bytes: een langer wachtwoord wordt stilzwijgend afgekapt, een bekende valkuil. De gangbare oplossing is om vooraf met SHA-256 te hashen en te coderen in base64 vóór bcrypt, maar dat kan problematische null bytes introduceren bij sommige implementaties. Argon2 kent deze limiet niet.

Argon2: 2015, winnaar PHC, 3 varianten

Argon2 is ontworpen door Alex Biryukov, Daniel Dinu en Dmitry Khovratovich. Het won de Password Hashing Competition in juli 2015 en is gestandaardiseerd in RFC 9106 (2021). Argon2 biedt drie parameters:

  • Memory cost (m): hoeveelheid gebruikt geheugen, in KiB
  • Time cost (t): aantal iteraties over het geheugenblok
  • Parallelism (p): aantal parallelle threads

Argon2 bestaat in drie varianten:

  • Argon2d: data-afhankelijke geheugentoegang. Beter bestand tegen GPU-aanvallen, maar gevoelig voor side-channel-aanvallen (timing, cache).
  • Argon2i: data-onafhankelijke geheugentoegang. Bestand tegen side-channels, iets minder bestand tegen GPU-aanvallen.
  • Argon2id: hybride, begint in i-modus en schakelt over naar d-modus. Standaard aanbevolen door RFC 9106 en OWASP.

De door OWASP in 2026 aanbevolen parameters voor Argon2id: m=19456 KiB (19 MiB), t=2, p=1. Typisch uitvoerformaat:

$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
 |         |   |                  |                 |
 |         |   parameters          zout base64       hash base64
 |         versie
 algo argon2id

Waarom Argon2id wordt aanbevolen

De weerstand tegen gespecialiseerde hardware is vandaag het doorslaggevende criterium. Bcrypt gebruikt weinig geheugen (~4 KiB), waardoor een high-end GPU honderdduizenden hashes per seconde kan testen. Argon2id is memory-hard: door meerdere MiB geheugen per poging af te dwingen, daalt het haalbare parallellisme op GPU drastisch en wordt het economisch onrendabel om speciale ASIC's te ontwerpen.

De hybride modus van Argon2id biedt bovendien bescherming tegen side-channel-aanvallen tijdens de eerste helft van de berekening. Die combinatie verklaart waarom het standaard wordt aanbevolen door OWASP, door NIST SP 800-63B (sinds de herziening van 2024) en door RFC 9106.

Vergelijkingstabel

Criterium Bcrypt Argon2id
Jaar19992015
StandaardisatieDe facto, USENIX 1999RFC 9106 (2021)
Parameterscostmemory, time, parallelism
Gebruikt geheugen~4 KiBConfigureerbaar (~19 MiB aanbevolen)
Memory-hardNeeJa
GPU-weerstandMatigSterk
Side-channel-weerstandGoed (constant-time)Goed (id-modus)
Invoerlimiet72 bytesGeen
OWASP-aanbeveling 2026AcceptabelVoorkeur
Volwassenheid ecosysteemZeer breedBreed sinds ~2018

Prestaties en weerstand tegen aanvallen

Op een moderne server duurt bcrypt met cost=12 ongeveer 250 ms en argon2id met de OWASP-parameters ongeveer 100-300 ms, afhankelijk van de machine. De absolute tijd is niet het criterium: wat telt is de verhouding tussen jouw kost (één berekening per login) en die van de aanvaller (miljarden berekeningen op GPU om een dump te kraken).

Op een RTX 4090 haalt hashcat ongeveer 200.000 bcrypt/s bij cost=12, tegenover enkele tienduizenden argon2id op 19 MiB. Voor dezelfde rekentijd aan serverzijde vertraagt Argon2id de aanvaller 5 tot 10 keer meer dan bcrypt, en het verschil groeit met elke nieuwe GPU-generatie.

PHP-voorbeelden

PHP ondersteunt beide native via password_hash() en password_verify() sinds PHP 7.2 voor Argon2i (en 7.3 voor Argon2id). De PHP-constructor regelt zout en formaat automatisch.

Bcrypt

$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$ok   = password_verify($password, $hash);

if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) {
    $hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}

Argon2id

$opts = [
    'memory_cost' => 19456,  // 19 MiB
    'time_cost'   => 2,
    'threads'     => 1,
];
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
$ok   = password_verify($password, $hash);

if (password_needs_rehash($hash, PASSWORD_ARGON2ID, $opts)) {
    $hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
}

Je kunt hashes van allerlei types genereren of identificeren met onze hash-generator en onze hash-identificator.

Aanbeveling

Voor een nieuwe toepassing in 2026 kies je Argon2id met de OWASP-parameters als basis (m=19456, t=2, p=1), bij te stellen op basis van de doeltijd (doorgaans 250 tot 500 ms). Als je een bestaande applicatie met bcrypt onderhoudt, is er geen haast bij om te migreren: bcrypt met cost=12 of meer blijft veilig in 2026. Maak bij de volgende login gebruik van password_needs_rehash() om actieve gebruikers geleidelijk naar Argon2id te migreren.

Vermijd absoluut kaal MD5, SHA-1 en SHA-256 voor wachtwoorden (zie onze vergelijking MD5 vs SHA-256). Geen van deze algoritmes is ontworpen voor dit doel.

Veelgestelde vragen

Is bcrypt nog veilig in 2026?

Ja, op voorwaarde dat je een voldoende hoge cost gebruikt (minimaal 12, 14 indien mogelijk). Bcrypt heeft geen bekende cryptografische zwakheid. Zijn enige relatieve zwakte tegenover Argon2id is de kleine geheugenvoetafdruk, waardoor het toegankelijker is voor GPU- en FPGA-aanvallen.

Moet ik een bcrypt-database migreren naar Argon2id?

Niet met spoed. Een geleidelijke migratie met password_needs_rehash() is de aanbevolen aanpak: bij elke geslaagde login her-hash je het wachtwoord met Argon2id. Na enkele maanden is de meerderheid van de actieve gebruikers gemigreerd en kun je een wachtwoordreset afdwingen voor slapende accounts.

Wat is het juiste aantal threads voor Argon2id?

OWASP raadt standaard p=1 aan. p verhogen levert weinig op als je webserver al veel parallelle verzoeken verwerkt, en het maakt de afstemming ingewikkelder. Geef liever de voorkeur aan het verhogen van m (geheugen), de belangrijkste hefboom voor GPU-weerstand.

Wat is een « bcrypt decrypter »?

Er bestaat geen bcrypt-decrypter: de functie is per ontwerp eenrichtings. Tools die beweren bcrypt te « ontsleutelen » testen alleen woordenboeken met veelvoorkomende wachtwoorden tegen de hash. Dat is precies hetzelfde als wat een aanvaller zou doen met jouw tabel.

Argon2i of Argon2id?

Argon2id in alle gevallen voor wachtwoorden. Argon2i is iets veiliger tegen side-channels maar zwakker tegen GPU-aanvallen. Argon2id combineert de voordelen van beide en wordt door RFC 9106 expliciet aanbevolen voor het hashen van wachtwoorden.

Moet je peperen (pepper) bovenop het zout?

Het zout volstaat voor de overgrote meerderheid van de toepassingen. Een peper (geheime sleutel die buiten de database wordt bewaard en als HMAC vóór de hash wordt gebruikt) voegt een extra laag toe bij een lek van de database zonder compromittering van de applicatieserver. Argon2id biedt dit niet native, je moet het handmatig samenstellen.