Generátor a overovač hashov hesiel

Heslá sa hashujú a overujú pomocou bcrypt, scrypt, Argon2id a PBKDF2 výhradne v prehliadači — generujú sa reťazce vo formáte PHC, overuje sa kandidátne heslo voči existujúcemu hashu a kontrolujú sa parametre skryté v ňom. Nič sa nenahráva.
Len pre testovacie heslá. Skutočné heslá používateľov sa nikdy nemajú vkladať na žiadnu webovú stránku. Tento nástroj beží celý v prehliadači — reťazce neopúšťajú kartu — ale skutočný únik začína jedným vložením.
náročnosť bcrypt (2^náročnosť kôl)
variant bcrypt variant mení len prefix; samotný hash je rovnaký
scrypt N (výpočtová náročnosť)
scrypt r / p r =   p = veľkosť bloku 128·r bajtov; pamäť = 128·N·r bajtov (N=214, r=8 → 16 MiB)
Argon2id m (pamäť)
Argon2id t / p t =   p = t = prechody; p = paralelizmus (pruhy)
PRF PBKDF2
Iterácie PBKDF2  OWASP 2023: 600 000 pre HMAC-SHA-256 (1 300 000 pre SHA-1, 210 000 pre SHA-384/512)
Dĺžka výstupu (bajty)  výstup bcrypt je pevne 23 bajtov (31 znakov bcrypt-base64)
AlgoritmusParametrePamäťDĺžka výstupuČas (tento prehliadač)
bcryptnáročnosť 124 KiB23 bajtov-
scryptN=214, r=8, p=116 MiB32 bajtov-
Argon2idm=19 MiB, t=2, p=119 MiB32 bajtov-
PBKDF2HMAC-SHA-256, 600 000 iterácií~032 bajtov-
Prehľad parametrov (OWASP Password Storage Cheat Sheet, minimá 2023)
AlgoritmusMinimumPoznámky
Argon2idm = 19 MiB (19 456 KiB), t = 2, p = 1uprednostňovaný; náročný na pamäť
scryptN = 214, r = 8, p = 1náročný na pamäť (minimálne 16 MiB)
bcryptnáročnosť = 10len náročnosť práce; limit hesla 72 bajtov
PBKDF2-HMAC-SHA256600 000 iteráciíodolný len iteráciami — vhodný pre GPU, posledná voľba
Predvolené hodnoty na tejto stránke sú na úrovni alebo nad každým minimom. Pre produkciu sa najskôr vyberie Argon2id, scrypt alebo bcrypt, ak nie je dostupný, a PBKDF2 len z dôvodu súladu s FIPS.
Interoperabilita s PHP — password_hash($pw, PASSWORD_BCRYPT) vydá $2y$10$...: vloží sa do overenia spolu s kandidátnym heslom a táto stránka odpovie presne to, čo by vrátila password_verify(). Výstup PASSWORD_ARGON2ID ($argon2id$v=19$m=65536,t=4,p=1$...) sa tiež overí. Reťazce PHC z passlib, django-argon2 a obalu crypto.scrypt sa tiež analyzujú.
Autotest
Znova spustí engine stránky proti verejným vektorom: testovaciu sadu crypt_blowfish pre bcrypt, reťazce scrypt a Argon2id generované cez node/OpenSSL, vektory PBKDF2 z RFC 6070 a verejnú sadu SHA-256, plus obojsmerné prevody generovanie-overenie vo všetkých algoritmoch a negatívne testy (zlé heslo musí zlyhať, chybne tvarované reťazce musia byť odmietnuté). Nič sa nikam neodosiela.
Hashovanie hesiel vysvetlené od začiatku
V jednej vete: hash hesla je úmyselne pomalý (a výhodne náročný na pamäť), aby krádež databázy neumožnila útočníkovi vyskúšať miliardy hádaní za sekundu — opak cieľa rýchleho hashu ako SHA-256, ktorý je stvorený pre rýchlosť.
Prečo jednoducho nehashovať heslo cez SHA-256?

SHA-256 na modernom GPU beží pri miliardách hádaní za sekundu. 8-znakové heslo má hlboko pod 1013 kombinácií — hodiny GPU času, minúty na veľkej zostave. Funkcie na hashovanie hesiel (KDF) proti tomu bojujú parametrami náročnosti: bcrypt opakuje svoje jadro 2cost-krát, PBKDF2 iteruje HMAC stovky tisíc krát, scrypt a Argon2id navyše vyžadujú megabajty pamäte na každé hádanie, takže GPU (rýchle, ale s malou pamäťou na jadro) stratia výhodu. Soľ — náhodná, uložená čitateľne vnútri reťazca hashu — bráni predpočítaným duhovým tabuľkám a núti počítať každé hádanie nanovo pre každého používateľa.

Štyri algoritmy na tejto stránke
AlgoritmusRokNáročnosťFormát podpisuPozor na
bcrypt1999CPU (2náročnosť nastavení kľúča)$2b$12$ + 22-znakový soľ + 31-znakový hashlimit hesla 72 bajtov (všetko za 72 sa potichu ignoruje); bajt NUL ukončuje heslo v pôvodnej implementácii v C
PBKDF22000 (RFC 2898/8018)CPU (iterácie)$pbkdf2-sha256$i=600000$ + soľ + hash (štýl passlib)žiadna pamäťová náročnosť — GPU a ASIC ju milujú; ladiť sa dá len počet iterácií
scrypt2009 (RFC 7914)CPU + pamäť (128·N·r bajtov)$scrypt$ln=14,r=8,p=1$ + soľ + hashN musí byť mocnina dvoch; pamäť rastie lineárne s r
Argon2id2015 (víťaz PHC, RFC 9106)CPU + pamäť (m KiB, t prechodov)$argon2id$v=19$m=19456,t=2,p=1$ + soľ + hashArgon2i (nezávislý od dát) oproti Argon2d (závislý od dát) oproti Argon2id (hybrid) — vždy sa vyberá id, pokiaľ nepoznáte dôvod, prečo nie
Odolnosť voči pamäti vs. výpočtová odolnosť

GPU má tisíce jadier, ale každé jadro má prístup len k malému množstvu rýchlej pamäte. KDF, ktorý potrebuje 19 MiB pracovnej množiny na hádanie, obmedzí útočníka na toľko paralelných hádaní, koľko má 19-MiB častí pamäte — preto môže byť Argon2id s 19 MiB v praxi silnejší než bcrypt s náročnosťou 15, aj keď na bežnom notebooku trvá menej reálneho času. PBKDF2 na to nemá odpoveď: jeho jediný ovládač je počet iterácií a kremík sa škáluje lineárne.

Čítanie reťazca PHC

Formát modular-crypt / PHC je samopopisný: v $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... polia sú algoritmus, verzia, parametre (m = pamäť v KiB, t = prechody, p = paralelné pruhy), soľ v base64, hash v base64. bcrypt predchádza štandardu a používa vlastný kompaktný tvar: variant $2b$, náročnosť 12, potom soľ a hash v abecede base64 bcrypt (./A-Za-z0-9). Overenie tejto stránky prijme všetky tieto formáty a ukáže analyzované polia — vložením ľubovoľného nájdeného hashu sa uvidí, na čo sa rozkladá.

Časté chyby
  • Rýchly hash pre heslá. Stĺpce hesiel MD5/SHA-1/SHA-256 padnú pred bežnými GPU pri miliardách hádaní za sekundu. Na súbory a dáta sa použije Generátor hashov; na heslá sa použijú algoritmy tejto stránky.
  • Zdieľanie soli. Jedna soľ pre všetkých používateľov znamená, že rovnaké heslá majú rovnaké hashe a duhové tabuľky fungujú. Každý hash tu dostane čerstvú náhodnú 16-bajtovú soľ.
  • Ignorovanie 72 bajtov bcrypt. "a"*100 a "a"*72 sa zahashujú rovnako — koncová časť sa zahodí. Táto stránka upozorní v poli vstupu, keď heslo presiahne 72 bajtov. Argon2 takýto limit nemá.
  • Porovnávanie hashov pomocou == vo vlastnom kóde. Overenie musí byť konštantné v čase; engine stránky to robí interne (znovu vypočíta a porovná uložené bajty), ale ak sa tento postup prevezme, použije sa porovnanie v konštantnom čase.
  • Ladenie parametrov na rýchlom vývojárskom počítači. Cieľ je ~250–500 ms hashovania na mediánovom hardvéri produkčných používateľov, nie na bežnej pracovnej stanici. Tlačidlo Porovnanie ukáže, čo tento prehliadač skutočne zažíva.
  • Rehashovanie pri každej kontrole prihlásenia. Najprv sa overí; rehashovanie (napr. na zvýšenie náročnosti) sa robí až po úspešnom overení a nový reťazec sa uloží. Funkcia PHP password_needs_rehash() existuje práve na tento účel.
FAQ

Ktorý si vybrať? Argon2id aspoň s minimami OWASP. Ak ho prostredie neponúka: scrypt, potom bcrypt (náročnosť taká, aby hashovanie trvalo ≥250 ms). PBKDF2 len tam, kde to vyžaduje certifikácia.

Prečo sa náhodná soľ zobrazuje vo výstupnom reťazci? Soľ nie je tajomstvo — je úmyselne uložená čitateľne vnútri reťazca PHC, takže overenie potrebuje len reťazec a kandidátne heslo. Jej úlohou je jedinečnosť, nie utajenie.

Záleží na variante ($2a$ / $2b$ / $2y$)? Pri heslách v ASCII vytvárajú rovnaké hashe; $2a$ je pôvodný z 90. rokov, $2b$ opravil zriedkavú chybu rozšírenia znamienka (2014), $2y$ je značka PHP, že oprava je prítomná. Overenie prijme všetky tri.

Ako dlho by mal hash trvať? Zhruba 250–500 ms na prihlásenie na serverovom hardvéri. Pod 100 ms je offline lámanie lacné; nad 1 s sa používatelia sťažujú skôr, než sa zlepší bezpečnosť.

Môžem overiť hash vytvorený inde? Áno — hash sa vloží a zadá sa kandidátne heslo. Overené formáty: PHP password_hash (bcrypt $2y$ a Argon2id), Python passlib, hasher argon2 z Django a formát reťazca scrypt, ktorý používa nástroj scrypt z Tarsnap.

Čo robí tlačidlo „porovnanie“? Jednorazovo zahashuje aktuálne heslo každým algoritmom s predvolenými parametrami stránky a oznámi čas v tomto prehliadači — ide o predstavu o rozdieloch v náročnosti, nie o presné meranie.