Utilia

Bcrypt-generator en -checker

Genereer een bcrypt-hash met een kostenfactor van 4 tot 14, controleer een wachtwoord tegen een bestaande hash en bekijk versie, kosten, salt en hash.

Een wachtwoord hashen

Een wachtwoord controleren tegen een hash

Zo hash je een wachtwoord met bcrypt

  1. Typ onder Een wachtwoord hashen het Wachtwoord. Een teller toont de lengte in UTF-8-bytes en waarschuwt als je boven de 72 bytes komt.
  2. Kies de Kostenfactor (4–14). De regel eronder toont het aantal rondes, bijvoorbeeld 10 → 2^10 = 1.024 rondes.
  3. Klik op Hash genereren. Een voortgangsbalk volgt het werk en de pagina blijft bruikbaar terwijl het loopt. Als het klaar is, toont de tool de benodigde tijd en de Bcrypt-hash, klaar om te kopiëren.
  4. De hash wordt opgesplitst in zijn onderdelen: Versie, Kosten, Salt (22 tekens) en Hash (31 tekens).

Om een wachtwoord te controleren tegen een hash typ je het wachtwoord, plak je de hash (de hash die je net hebt gegenereerd wordt automatisch ingevuld) en klik je op Wachtwoord controleren. Het resultaat zegt of ze overeenkomen. Vink Wachtwoorden verbergen aan om beide wachtwoordvelden te maskeren.

Het hashen gebeurt in je browser met de bibliotheek bcryptjs, die pas wordt geladen als je hem voor het eerst nodig hebt. Er wordt geen wachtwoord of hash verstuurd.

Hoe bcrypt werkt

bcrypt (Provos en Mazières, 1999) is een hashfunctie voor wachtwoorden die gebouwd is op het Blowfish-algoritme. Anders dan SHA-256 is bcrypt bewust traag, en die traagheid is instelbaar: de kostenfactor is een macht van twee, dus elke +1 verdubbelt het werk. Kosten 10 betekent 1.024 herhalingen van de dure sleutelopbouw; kosten 12 betekent 4.096. Bij het inloggen merkt een gebruiker daar nauwelijks iets van, maar brute force op een gestolen database wordt er veel duurder door.

Een hash zoals $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy lees je zo:

  • $2b$: de versie. $2a$ en $2y$ (PHP) zijn compatibel en kunnen hier worden gecontroleerd; $2x$ staat voor hashes uit een oude implementatie met een bug en wordt geweigerd.
  • 10: de kostenfactor.
  • De volgende 22 tekens: een willekeurige salt van 128 bits, in bcrypts eigen Base64-alfabet (./A-Za-z0-9).
  • De laatste 31 tekens: het resultaat van 184 bits.

Omdat de salt willekeurig is en in de hash wordt bewaard, geeft hetzelfde wachtwoord twee keer hashen twee verschillende hashes, en beide worden correct geverifieerd. Daarom controleer je een wachtwoord met een verify-functie en vergelijk je geen hashes.

De kosten kiezen

Kies de hoogste kosten die je server aankan terwijl het inloggen snel blijft, meestal rond een kwart seconde per hash. OWASP raadt voor bcrypt een minimale kostenfactor van 10 aan. Browsers draaien bcrypt in JavaScript, dat een paar keer trager is dan een native implementatie op een server: vanaf kosten 12 waarschuwt de tool dat hashen een tot enkele seconden kan duren, en elke extra stap verdubbelt de tijd. Het werk wordt in korte stukjes verdeeld, zodat de pagina niet bevriest.

Voor nieuwe systemen geeft OWASP inmiddels de voorkeur aan Argon2id; bcrypt blijft acceptabel waar Argon2id niet beschikbaar is.

De grens van 72 bytes

bcrypt gebruikt alleen de eerste 72 bytes van het wachtwoord; alles daarna wordt stilzwijgend genegeerd. Bytes zijn geen tekens: een letter met accent neemt in UTF-8 2 bytes in en een emoji 4. Twee lange wachtwoorden met dezelfde eerste 72 bytes geven dezelfde hash. De byteteller waarschuwt je als een wachtwoord te lang is. Sommige systemen hashen lange wachtwoorden eerst (bijvoorbeeld met HMAC-SHA256 en daarna Base64) voordat ze bcrypt gebruiken. Doe je dat, geef dan nooit ruwe binaire digests door, want een nulbyte beëindigt het wachtwoord in veel implementaties te vroeg.

Veelgestelde vragen

Waarom geeft hetzelfde wachtwoord elke keer een andere hash?

Elke hash krijgt een nieuwe willekeurige salt, die in de hash zelf wordt bewaard. De knop Wachtwoord controleren leest salt en kosten uit de hash en berekent hem opnieuw, zodat elke versie klopt.

Kun je een bcrypt-hash ontsleutelen?

Nee. bcrypt is een eenrichtingsfunctie. De enige manier om een wachtwoord terug te vinden is raden en elke gok hashen, en precies dat maakt de kostenfactor traag.

Welke kostenfactor moet ik gebruiken?

Minstens 10, en meer als je server snel genoeg blijft. Meet op je productiehardware: de tijd die je hier ziet, geldt voor JavaScript in je browser, dat meestal trager is dan een server.

Zijn $2a$-, $2b$- en $2y$-hashes uitwisselbaar?

Voor wachtwoorden onder 256 bytes geven ze hetzelfde resultaat, en deze tool controleert alle drie. $2b$ loste een bug op met het overlopen van de lengte in de implementatie van OpenBSD, en $2y$ is de PHP-naam voor een correcte implementatie.

Is het veilig om hier een echt wachtwoord te typen?

Alles draait lokaal en er wordt niets verstuurd of opgeslagen. Voor echte accounts is het toch verstandig om te testen met een voorbeeldwachtwoord in plaats van een wachtwoord dat je echt gebruikt.