Generátor a ověřovač hashů hesel

Hashujte a ověřujte hesla pomocí bcrypt, scrypt, Argon2id a PBKDF2 zcela ve vašem prohlížeči — generujte řetězce ve formátu PHC, ověřte kandidátské heslo proti existujícímu hashi a prohlédněte si parametry skryté uvnitř. Nic se nenahrává.
Jen pro zkušební hesla. Skutečná uživatelská hesla se nikdy nesmí vkládat na žádnou webovou stránku. Tento nástroj běží zcela ve vašem prohlížeči — řetězce neopustí vaši kartu — ale skutečný únik začíná jediným vložením.
náklady bcrypt (2^náklady kol)
Varianta bcrypt varianta mění jen předponu; samotný hash je totožný
scrypt N (výpočetní náklady)
scrypt r / p r =   p = velikost bloku 128·r bajtů; paměť = 128·N·r bajtů (N=214, r=8 → 16 MiB)
Argon2id m (paměť)
Argon2id t / p t =   p = t = průchody; p = paralelismus (pruhy)
PRF PBKDF2
Iterace PBKDF2  OWASP 2023: 600 000 pro HMAC-SHA-256 (1 300 000 pro SHA-1, 210 000 pro SHA-384/512)
Délka výstupu (bajty)  Výstup bcrypt má pevnou délku 23 bajtů (31 znaků base64 bcrypt)
AlgoritmusParametryPaměťDélka výstupuČas (tento prohlížeč)
bcryptnáklady 124 KiB23 bajtů-
scryptN=214, r=8, p=116 MiB32 bajtů-
Argon2idm = 19 MiB, t = 2, p = 119 MiB32 bajtů-
PBKDF2HMAC-SHA-256, 600 000 iterací~032 bajtů-
Přehled parametrů (OWASP Password Storage Cheat Sheet, minima 2023)
AlgoritmusMinimumPoznámky
Argon2idm = 19 MiB (19 456 KiB), t = 2, p = 1doporučeno; paměťově náročný
scryptN = 214, r = 8, p = 1paměťově náročný (minimálně 16 MiB)
bcryptnáklady = 10pouze pracovní faktor; limit hesla 72 bajtů
PBKDF2-HMAC-SHA256600 000 iteracíjen náročnost iteracemi — vhodné pro GPU, poslední volba
Výchozí hodnoty na této stránce jsou na každém minimu nebo nad ním. Pro produkci zvolte nejprve Argon2id, scrypt nebo bcrypt, pokud není dostupný, a PBKDF2 jen z důvodů shody s FIPS.
Interoperabilita s PHP — password_hash($pw, PASSWORD_BCRYPT) vydá $2y$10$...: vložte jej do Ověření s kandidátským heslem a tato stránka odpoví přesně tak, jak by odpověděla password_verify(). Výstup PASSWORD_ARGON2ID ($argon2id$v=19$m=65536,t=4,p=1$...) se také ověří. Řetězce PHC z passlib, django-argon2 a obalu crypto.scrypt se také zpracují.
Autotest
Znovu spustí engine stránky proti veřejným vektorům: testovací sadu crypt_blowfish pro bcrypt, řetězce scrypt a Argon2id generované Node/OpenSSL, vektory PBKDF2 z RFC 6070 a veřejnou sadu SHA-256, plus kruhové testy generovat–ověřit ve všech algoritmech a negativní testy (špatné heslo musí selhat, chybně utvořené řetězce musí být odmítnuty). Nic se nikam neodesílá.
Hashování hesel od začátku
Ve stručnosti: hash hesla je záměrně pomalý (a nejlépe paměťově náročný), aby ukradení databáze útočníkovi nedovolilo zkoušet miliardy pokusů za sekundu — opak cíle rychlého hashe jako SHA-256, který je postaven na rychlosti.
Proč nehashovat heslo rovnou pomocí SHA-256?

SHA-256 na moderním GPU běží na miliardách pokusů za sekundu. Osmiznakové heslo má výrazně méně než 1013 kombinací — hodiny GPU času, minuty na velké sestavě. Funkce pro hashování hesel (KDF) tomu čelí parametry náročnosti: bcrypt opakuje své jádro 2nákladykrát, PBKDF2 iteruje HMAC stovky tisíc krát, scrypt a Argon2id navíc vyžadují megabajty paměti na každý pokus, takže GPU (rychlé, ale s chudou pamětí na jádro) ztrácejí výhodu. Sůl — náhodná, uložená v čitelné podobě uvnitř řetězce hashe — brání předpočítaným duhovým tabulkám a nutí každý pokus počítat znovu pro každého uživatele.

Čtyři algoritmy na této stránce
AlgoritmusRokNáročnostFormát podpisuPozor na
bcrypt1999CPU (2náklady nastavení klíče)$2b$12$ + 22znakový solný řetězec + 31znakový hashlimit hesla 72 bajtů (vše za 72 je tiše ignorováno); bajt NUL ukončuje heslo v původní implementaci v C
PBKDF22000 (RFC 2898/8018)CPU (iterace)$pbkdf2-sha256$i=600000$ + sůl + hash (styl passlib)bez paměťových nákladů — GPU a ASIC to milují; laditelný je jen počet iterací
scrypt2009 (RFC 7914)CPU + paměť (128·N·r bajtů)$scrypt$ln=14,r=8,p=1$ + sůl + hashN musí být mocnina dvou; paměť roste lineárně s r
Argon2id2015 (vítěz PHC, RFC 9106)CPU + paměť (m KiB, t průchodů)$argon2id$v=19$m=19456,t=2,p=1$ + sůl + hashArgon2i (nezávislý na datech) vs Argon2d (závislý na datech) vs Argon2id (hybridní) — vždy volte id, pokud nevíte proč ne
Paměťová náročnost vs výpočetní náročnost

GPU má tisíce jader, ale každé jádro má přístup jen k malé rychlé paměti. KDF, které pro každý pokus potřebuje 19 MiB pracovní množiny, omezí útočníka na tolik paralelních pokusů, kolik má kusů paměti po 19 MiB — proto může být Argon2id s 19 MiB v praxi silnější než bcrypt s nákladem 15, přestože na vašem notebooku trvá kratší dobu. PBKDF2 na to nemá odpověď: jeho jediný regulátor je počet iterací a křemík to škáluje lineárně.

Čtení řetězce PHC

Formát modular-crypt / PHC je samopopisný: v $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... jsou pole algoritmus, verze, parametry (m = paměť v KiB, t = průchody, p = pruhy), sůl v base64, hash v base64. bcrypt je starší než standard a používá vlastní kompaktní tvar: varianta $2b$, náklady 12, pak sůl a hash ve vlastní abecedě base64 bcrypt (./A-Za-z0-9). Ověření na této stránce přijímá všechny tyto tvary a ukazuje rozebraná pole — vložte libovolný hash, který najdete, a uvidíte, z čeho se skládá.

Časté chyby
  • Rychlý hash pro hesla. Sloupce hesel s MD5/SHA-1/SHA-256 padnou na běžné GPU při miliardách pokusů za sekundu. Pro soubory a data používejte Generátor hashů; pro hesla algoritmy této stránky.
  • Sdílená sůl. Jedna sůl pro všechny uživatele znamená, že stejná hesla mají stejné hashe a vracejí se duhové tabulky. Každý hash zde dostane novou náhodnou sůl o 16 bajtech.
  • Ignorování 72 bajtů bcrypt. "a"*100 a "a"*72 se zahashují stejně — konec se zahodí. Tato stránka upozorní u vstupního pole, když heslo přesáhne 72 bajtů. Argon2 takový limit nemá.
  • Porovnávání hashů pomocí == ve vlastním kódu. Ověřování musí být konstantní v čase; engine stránky to dělá interně (přepočítá a porovná uložené bajty), ale pokud přejímáte tento přístup, použijte porovnání v konstantním čase.
  • Ladění parametrů na rychlém vývojářském stroji. Cílem je ~250–500 ms hashování na mediánovém hardwaru produkčních uživatelů, ne na vaší pracovní stanici. Tlačítko Porovnání ukáže, jak tento prohlížeč skutečně zpracovává.
  • Přehashování při každé kontrole přihlášení. Nejprve ověřte; přehashovat (např. kvůli zvýšení nákladů) až po úspěšném ověření a uložte nový řetězec. Funkce PHP password_needs_rehash() existuje právě pro tento účel.
Časté dotazy

Který zvolit? Argon2id alespoň s minimy OWASP. Pokud jej běhové prostředí nenabízí: scrypt, pak bcrypt (náklady takové, aby hashování trvalo ≥250 ms). PBKDF2 jen tam, kde to vyžaduje certifikace.

Proč je náhodná sůl vidět ve výstupním řetězci? Sůl není tajemství — je záměrně uložena v čitelné podobě uvnitř řetězce PHC, takže ověření potřebuje jen řetězec a kandidátské heslo. Její úkol je jedinečnost, ne tajnost.

Záleží na variantě ($2a$ / $2b$ / $2y$)? U ASCII hesel dávají identické hashe; $2a$ je původní verze z 90. let, $2b$ opravil vzácnou chybu rozšíření znaménka (2014), $2y$ je značka PHP, že oprava je přítomna. Ověření přijímá všechny tři.

Jak dlouho by měl hash trvat? Zhruba 250–500 ms na přihlášení na serverovém hardwaru. Pod 100 ms je offline lámání levné; nad 1 s si uživatelé stěžují dřív, než se zlepší bezpečnost.

Mohu ověřit hash vytvořený jinde? Ano — vložte jej a zadejte kandidátské heslo. Známé dobré formáty: PHP password_hash (bcrypt $2y$ a Argon2id), Python passlib, hasher argon2 z Django a formát řetězce scrypt používaný nástrojem scrypt od Tarsnap.

Co dělá tlačítko „porovnání“? Jednou zahashuje aktuální heslo každým algoritmem s výchozími parametry stránky a hlásí dobu běhu v tomto prohlížeči — představu o rozdílech nákladů, nikoli přesné měření.