bcrypt werd in 1999 voorgesteld door Niels Provos en David Mazières van het OpenBSD-project, in een artikel met de titel "A Future-Adaptable Password Scheme". Het kernidee zit al in die titel: een hashfunctie voor wachtwoorden moet trager kunnen worden naarmate computers sneller worden. Waar een snelle functie als SHA-256 een aanvaller miljarden kandidaten laat testen, maakt bcrypt elke poging duur, voor de aanvaller en voor de server.
Hoe bcrypt werkt
bcrypt is gebaseerd op een variant van het versleutelingsalgoritme Blowfish waarvan de sleutelvoorbereiding bewust kostbaar is. Drie elementen gaan de berekening in:
- het wachtwoord, waarvan alleen de eerste 72 bytes meetellen;
- een willekeurige salt, voor elk wachtwoord opnieuw gekozen;
- een kostenfactor: elke extra eenheid verdubbelt de rekentijd.
Het resultaat bevat alles wat nodig is om het wachtwoord later te controleren: de aanduiding van het algoritme ($2y$ in PHP), de kosten, de salt en de hash. De functie password_verify() leest die parameters terug en doet de berekening opnieuw, zonder dat de salt apart hoeft te worden opgeslagen.
$hash = password_hash( $wachtwoord, PASSWORD_BCRYPT ); // kosten 12 standaard sinds PHP 8.4
password_verify( $invoer, $hash ); // true of false
bcrypt naast andere algoritmen
Het OWASP-spiekbriefje over het opslaan van wachtwoorden zet Argon2id op de eerste plaats en scrypt daarna, en raadt bcrypt aan voor bestaande systemen, met een kostenfactor van minstens 10 en extra aandacht voor de limiet van 72 bytes. Toch blijft bcrypt heel wijdverbreid, omdat het overal beschikbaar is: het is het enige algoritme dat PHP op elke installatie garandeert. In elk geval beschermt het veel beter dan een snelle functie als MD5 of SHA-1 op zichzelf, die je op een grafische kaart in een enorm tempo kunt berekenen.
Voor WordPress
Jarenlang gebruikte WordPress de bibliotheek phpass, gebaseerd op MD5 met veel iteraties. WordPress 6.8, uitgebracht op 15 april 2025, stapte voor gebruikerswachtwoorden over op bcrypt. De details, gepubliceerd op het blog van de core-ontwikkelaars:

- Het wachtwoord wordt eerst gehasht met HMAC-SHA384 en daarna in base64 gecodeerd, zodat wachtwoorden van meer dan 72 bytes al hun entropie behouden.
- De hashes beginnen met het voorvoegsel
$wp$2y$, dat ze onderscheidt van een gewone bcrypt-hash. - Oude phpass-hashes worden nog geaccepteerd en bij de volgende keer inloggen of de volgende wachtwoordwijziging van elke gebruiker omgezet naar bcrypt.
- Applicatiewachtwoorden, resetsleutels en enkele andere tokens gebruiken een andere functie, BLAKE2b via de Sodium-bibliotheek; bestaande applicatiewachtwoorden worden niet automatisch omgezet.
- Met het filter
wp_hash_password_algorithmkun je Argon2id kiezen als de server het ondersteunt, en metwp_hash_password_optionspas je de parameters aan, zoals de kosten.
Je hoeft zelf niets te doen. Onthoud alleen dat een terugkeer naar WordPress 6.7 of ouder gebruikers die al zijn omgezet, buitensluit tot ze hun wachtwoord opnieuw instellen. Ons artikel over wp-config.php gaat in op deze wijziging en op de beveiligingssleutels in dat bestand.
Wat bcrypt niet doet
bcrypt beschermt wachtwoorden nadat de database is uitgelekt: het vertraagt het offline achterhalen ervan. Het doet niets tegen een online brute-force-aanval op de inlogpagina, en ook niets tegen een wachtwoord dat al in een lek staat en elders wordt hergebruikt, de basis van credential stuffing. Daarvoor reken je op unieke wachtwoorden, het beperken van inlogpogingen en tweefactorauthenticatie, die WP Masquerade Pro aanbiedt naast het beperken van inlogpogingen.