Utilia

Generátor a kontrola bcrypt

Vygeneruj hash bcrypt s faktorom náročnosti 4 až 14, over heslo voči existujúcemu hashu a zobraz jeho verziu, náročnosť, soľ a výsledný hash.

Zahašovať heslo

Skontrolovať heslo voči hashu

Ako zahašovať heslo pomocou bcrypt

  1. V sekcii Zahašovať heslo napíš Heslo. Počítadlo ukazuje jeho dĺžku v bajtoch UTF-8 a upozorní ťa, keď presiahne 72 bajtov.
  2. Vyber Faktor náročnosti (4–14). Riadok pod ním ukazuje počet kôl, napríklad 10 → 2^10 = 1 024 kôl.
  3. Klikni na Generovať hash. Indikátor sleduje priebeh práce a stránka zostáva počas výpočtu použiteľná. Po dokončení nástroj ukáže čas výpočtu a Hash bcrypt, pripravený na skopírovanie.
  4. Hash je rozdelený na časti: Verzia, Náročnosť, Soľ (22 znakov) a Hash (31 znakov).

Ak chceš skontrolovať heslo voči hashu, napíš heslo, vlož hash (ten, ktorý si práve vygeneroval, sa vyplní automaticky) a klikni na Skontrolovať heslo. Výsledok povie, či sa zhodujú. Zaškrtnutím Skryť heslá zamaskuješ obe polia s heslom.

Hašovanie beží v tvojom prehliadači pomocou knižnice bcryptjs, ktorá sa načíta až pri prvom použití. Žiadne heslo ani hash sa nikam neodosiela.

Ako funguje bcrypt

bcrypt (Provos a Mazières, 1999) je funkcia na hašovanie hesiel postavená na šifre Blowfish. Na rozdiel od SHA-256 je zámerne pomalá a jej pomalosť sa dá nastaviť: faktor náročnosti je mocnina dvoch, takže každé zvýšenie o 1 zdvojnásobí prácu. Náročnosť 10 znamená 1 024 iterácií drahého nastavenia kľúča, náročnosť 12 znamená 4 096. Pri prihlásení používateľa to prakticky nevadí, no hrubá sila na ukradnutú databázu je omnoho drahšia.

Hash ako $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy sa číta takto:

  • $2b$: verzia. $2a$ a $2y$ (PHP) sú kompatibilné a dajú sa tu skontrolovať. $2x$ označuje hashe zo starej chybnej implementácie a nástroj ich odmietne.
  • 10: faktor náročnosti.
  • Nasledujúcich 22 znakov: náhodná 128‑bitová soľ vo vlastnej abecede Base64 algoritmu bcrypt (./A-Za-z0-9).
  • Posledných 31 znakov: 184‑bitový výsledok.

Keďže soľ je náhodná a uložená priamo v hashi, dvojnásobné zahašovanie rovnakého hesla dá dva rôzne hashe a oba sa overia správne. Preto sa heslo overuje funkciou na overenie, a nie porovnávaním hashov.

Voľba náročnosti

Zvoľ najvyššiu náročnosť, akú tvoj server zvládne, pričom prihlasovanie ostane rýchle, zvyčajne okolo štvrť sekundy na hash. OWASP odporúča pre bcrypt minimálnu náročnosť 10. Prehliadače spúšťajú bcrypt v JavaScripte, čo je niekoľkokrát pomalšie než natívna implementácia na serveri: od náročnosti 12 nástroj upozorní, že hašovanie môže trvať jednu až niekoľko sekúnd, a každý ďalší krok čas zdvojnásobí. Práca sa delí na krátke úseky, takže stránka nezamrzne.

Pre nové systémy OWASP dnes uprednostňuje Argon2id, pričom bcrypt je stále prijateľný tam, kde Argon2id nie je k dispozícii.

Limit 72 bajtov

bcrypt používa iba prvých 72 bajtov hesla, všetko ďalšie sa potichu ignoruje. Bajty nie sú znaky: písmeno s diakritikou zaberá v UTF-8 2 bajty a emoji 4 bajty. Dve dlhé heslá, ktoré majú rovnakých prvých 72 bajtov, dajú rovnaký hash. Počítadlo bajtov ťa upozorní, keď je heslo príliš dlhé. Niektoré systémy dlhé heslá pred bcryptom najprv zahašujú (napríklad HMAC-SHA256 a potom Base64). Ak to robíš, nikdy nepodávaj surové binárne výstupy, pretože nulový bajt by v mnohých implementáciách heslo predčasne ukončil.

Často kladené otázky

Prečo dá rovnaké heslo vždy iný hash?

Každý hash dostane novú náhodnú soľ, ktorá je uložená vnútri hashu. Tlačidlo Skontrolovať heslo načíta soľ a náročnosť z hashu a vypočíta ho znova, takže sa overí každá verzia.

Dá sa hash bcrypt dešifrovať?

Nie. bcrypt je jednosmerná funkcia. Jediný spôsob, ako získať heslo, je hádať ho a hašovať každý pokus, a práve to faktor náročnosti spomaľuje.

Aký faktor náročnosti mám použiť?

Aspoň 10, a viac, ak tvoj server ostane dostatočne rýchly. Meraj na produkčnom hardvéri: čas zobrazený tu zodpovedá JavaScriptu v tvojom prehliadači, ktorý je zvyčajne pomalší než server.

Sú hashe $2a$, $2b$ a $2y$ zameniteľné?

Pri heslách do 256 bajtov dávajú rovnaký výsledok a tento nástroj skontroluje všetky tri. $2b$ opravila chybu pretečenia dĺžky v implementácii OpenBSD a $2y$ je názov v PHP pre správnu implementáciu.

Je bezpečné písať sem skutočné heslo?

Všetko beží lokálne a nič sa neodosiela ani neukladá. Pri skutočných účtoch je aj tak dobrým zvykom testovať na ukážkovom hesle, nie na takom, ktoré používaš.