Utilia

Generátor a kontrola bcrypt

Vytvoř hash bcrypt s faktorem nákladnosti od 4 do 14, zkontroluj heslo proti existujícímu hashi a zobraz jeho verzi, nákladnost, sůl a otisk.

Zahashovat heslo

Zkontrolovat heslo proti hashi

Jak zahashovat heslo pomocí bcrypt

  1. V části Zahashovat heslo napiš Heslo. Počítadlo ukazuje jeho délku v bajtech UTF-8 a upozorní tě, když přesáhne 72 bajtů.
  2. Zvol Faktor nákladnosti (4–14). Řádek pod ním ukazuje počet kol, například 10 → 2^10 = 1 024 kol.
  3. Klikni na Generovat hash. Ukazatel průběhu sleduje práci a stránka zůstává během výpočtu použitelná. Po dokončení nástroj zobrazí potřebný čas a Hash bcrypt, připravený ke zkopírování.
  4. Hash je rozdělen na části: Verze, Nákladnost, Sůl (22 znaků) a Hash (31 znaků).

Chceš-li zkontrolovat heslo proti hashi, napiš heslo, vlož hash (ten, který jsi právě vytvořil, se vyplní automaticky) a klikni na Zkontrolovat heslo. Výsledek řekne, zda si odpovídají. Zaškrtnutím Skrýt hesla zamaskuješ obě pole s heslem.

Hashování běží ve tvém prohlížeči pomocí knihovny bcryptjs, která se načte, až když ji poprvé potřebuješ. Žádné heslo ani hash se nikam neodesílá.

Jak bcrypt funguje

bcrypt (Provos a Mazières, 1999) je funkce pro hashování hesel postavená na šifře Blowfish. Na rozdíl od SHA-256 je záměrně pomalá a její pomalost lze nastavit: faktor nákladnosti je mocnina dvou, takže každé zvýšení o 1 zdvojnásobí práci. Nákladnost 10 znamená 1 024 iterací náročného nastavení klíče, nákladnost 12 pak 4 096. Při přihlášení uživatele na této pomalosti prakticky nezáleží, ale útok hrubou silou na odcizenou databázi se tím výrazně prodraží.

Hash jako $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy se čte takto:

  • $2b$: verze. $2a$ a $2y$ (PHP) jsou kompatibilní a lze je zde ověřit. $2x$ označuje hashe ze staré chybné implementace a je odmítnuto.
  • 10: faktor nákladnosti.
  • Dalších 22 znaků: náhodná 128bitová sůl v abecedě Base64, kterou používá bcrypt (./A-Za-z0-9).
  • Posledních 31 znaků: 184bitový výsledek.

Protože je sůl náhodná a uložená přímo v hashi, dvojí zahashování stejného hesla dá dva různé hashe a oba se ověří správně. Proto se heslo kontroluje ověřovací funkcí a hashe se nesrovnávají přímo.

Volba nákladnosti

Zvol nejvyšší nákladnost, kterou si tvůj server může dovolit, aniž by se zpomalilo přihlašování, obvykle kolem čtvrt sekundy na hash. OWASP doporučuje pro bcrypt minimální nákladnost 10. Prohlížeče spouštějí bcrypt v JavaScriptu, což je několikrát pomalejší než nativní implementace na serveru: od nákladnosti 12 nástroj upozorňuje, že hashování může trvat od jedné do několika sekund, a každý další krok čas zdvojnásobí. Práce je rozdělena na krátké úseky, takže se stránka nezasekne.

Pro nové systémy OWASP dnes upřednostňuje Argon2id, přičemž bcrypt je stále přijatelný tam, kde Argon2id není k dispozici.

Limit 72 bajtů

bcrypt používá jen prvních 72 bajtů hesla, vše za nimi se tiše ignoruje. Bajty nejsou znaky: písmeno s diakritikou zabere v UTF-8 2 bajty a emoji 4. Dvě dlouhá hesla, která sdílejí prvních 72 bajtů, dají stejný hash. Počítadlo bajtů tě upozorní, že je heslo příliš dlouhé. Některé systémy dlouhá hesla před bcryptem předem zahashují (například pomocí HMAC-SHA256 a pak Base64). Pokud to děláš, nikdy nepředávej surové binární otisky, protože nulový bajt by v mnoha implementacích předčasně ukončil heslo.

Časté dotazy

Proč dává stejné heslo pokaždé jiný hash?

Každý hash dostane novou náhodnou sůl, která je uložena uvnitř hashe. Tlačítko Zkontrolovat heslo načte sůl a nákladnost z hashe a vypočítá ho znovu, takže se ověří každá verze.

Dá se hash bcrypt dešifrovat?

Ne. bcrypt je jednosměrná funkce. Jediný způsob, jak heslo zjistit, je hádat ho a hashovat každý pokus, a právě to faktor nákladnosti zpomaluje.

Jaký faktor nákladnosti mám použít?

Alespoň 10, a více, pokud je tvůj server dostatečně rychlý. Měř na produkčním hardwaru: zde zobrazený čas odpovídá JavaScriptu ve tvém prohlížeči, který bývá pomalejší než server.

Jsou hashe $2a$, $2b$ a $2y$ zaměnitelné?

U hesel kratších než 256 bajtů dávají stejný výsledek a tento nástroj ověřuje všechny tři. $2b$ opravila chybu přetečení délky v implementaci OpenBSD a $2y$ je název z PHP pro správnou implementaci.

Je bezpečné sem psát skutečné heslo?

Vše běží lokálně a nic se neodesílá ani neukládá. U skutečných účtů je přesto dobrým zvykem testovat na vzorovém heslu, ne na tom, které opravdu používáš.