První řádek zaznamenává přesné použité parametry (algoritmus, čtení, velikosti vstupů), takže zkopírovaný výsledek je vždy reprodukovatelný.
HMAC, PBKDF2 a HKDF — klíčované hashování vysvětlené od začátku
Jednou větou: holý hash jako SHA-256 může spočítat kdokoli, takže neprokazuje, kdo zprávu odeslal — HMAC přimíchá tajný klíč, takže otisk mohou vytvořit (nebo ověřit) jen držitelé klíče; PBKDF2 a HKDF pak používají tentýž stroj HMAC k přeměně tajemství v klíče, pomalu pro hesla a rychle pro již náhodný materiál.
Co je HMAC (RFC 2104)
Konstrukce. HMAC jsou dva běhy hashe, ne jeden. Klíč se doplní na velikost bloku hashe (64 bajtů pro MD5/SHA-1/SHA-256, 128 pro SHA-384/512); zpráva se jednou zahashuje s klíčem XOR s pevnou vnitřní výplní a tento otisk se znovu zahashuje s klíčem XOR s pevnou vnější výplní. Tento dvojitý sendvič je prokazatelně bezpečný, pokud je podkladový hash slušná pseudonáhodná funkce — proto HMAC-MD5 stále odolává praktickým útokům na kolize, které lámaly prostý MD5 (i když je stejně vyřazen, viz níže).
Klíče. Funguje libovolná délka klíče: kratší než velikost bloku se použije tak, jak je (ale pod 32 bajtů se nedoporučuje), delší se nejprve zahashuje. Stejná stránka umožňuje zadat klíč jako text, hex nebo Base64, takže lze vložit produkční klíč o 64 hex znacích, aniž by si jej někdo spletl s textovým heslem o 64 znacích — čtení je proto zapsáno do výstupního řádku.
Kde se s ním setkáte. Pole HS256 v hlavičce JWT je doslova HMAC-SHA-256 nad base64url kódovanými částmi tokenu (dekodér JWT na tomto webu to přesně počítá, když vložíte tajný klíč HS256). Podpisy webhooků (Stripe, GitHub), AWS SigV4, ochrana záznamů TLS (starší verze) a příbuzný umac-64@openssh.com v OpenSSH patří do stejné rodiny.
Proč prostě ne hash(zpráva || klíč)? Rozšíření délky: každý hash z rodiny MD5/SHA-1/SHA-2 umožní útočníkovi, který zná H(secret || msg), spočítat H(secret || msg || padding || cokoli) bez tajemství. Rozdělení HMAC na vnitřní a vnější část tuto třídu útoků zastaví. Je to nejčastější chyba u kódu podpisů API typu „udělej si sám“ — a důvod, proč HMAC existuje.
Co je PBKDF2 (RFC 8018)
Záměrně pomalé. Heslo má zhruba 40 bitů skutečné entropie; GPU útočníka zkouší miliardy prostých SHA-256 za sekundu. PBKDF2 opakuje HMAC(password, salt) znovu a znovu — iterkrát — takže každý pokus stojí pro vás i pro útočníka stejných iter HMAC. Výchozí hodnota zde je 600 000 iterací s HMAC-SHA-256, základ z OWASP Password Storage Cheat Sheet; posuvník jde až na deset milionů, protože bezpečnostní doporučení rostou spolu s rychlostí hardwaru.
Sůl. Náhodná sůl pro každé heslo znamená, že stejní uživatelé se již nehashují stejně a předpočítané tabulky (duhové tabulky) ztrácejí cenu. Není tajná — ukládá se vedle hashe — jen musí být jedinečná. Běžných je 16 náhodných bajtů.
Známá slabina. PBKDF2 je náročné na CPU, ale ne na paměť: GPU a ASIC jej paralelizují výborně. Proto moderní doporučení znějí scrypt nebo Argon2id, když se navrhuje ukládání hesel (stránka generátoru hashů hesel v této rodině je pokrývá), a PBKDF2 zůstává správnou volbou pro kompatibilitu a nastavení FIPS-140.
Co je HKDF (RFC 5869)
Extrahovat, pak rozšířit. HKDF dělá dvě práce. Extrakce: stlačí možná nerovnoměrný vstupní materiál klíče (např. sdílené tajemství Diffie–Hellmana) spolu se solí do jednoho krátkého pseudonáhodného klíče PRK = HMAC(salt, IKM). Rozšíření: natáhne tento PRK na libovolnou délku až 255 bloků hashe, přičemž každý výstupní blok je řetězen s předchozím a označen polem info. Výsledkem je, že jedno tajemství vám může bezpečně dát šifrovací klíč, klíč MAC a IV, všechny oddělené.
Ne pro hesla. HKDF předpokládá, že jeho vstup už má plnou entropii — provádí jeden HMAC na 32 výstupních bajtů, takže lidské heslo jím projde prakticky okamžitě, přesně jak si útočník přeje. Posílat hesla přes HKDF místo PBKDF2 je klasická konstrukční chyba; pole info slouží k popiskám účelu ("client traffic key", "server iv"), ne k dodatečné entropii.
Kde se s ním setkáte. TLS 1.3 odvozuje každý klíč, který používá, z tajemství handshake přes HKDF; WireGuard, Signal, EAP-TLS 1.3 a JSON Web Encryption (jako přímá KDF dohody klíčů) se všechny objevují na stejném rodokmenu.
Kontrolní hodnoty — reprodukujte je na této stránce
První dvě tabulky jsou testovací vektory, na nichž jsou postavena tlačítko Ukázka a samotest této stránky (klíč "key", zpráva „The quick brown fox jumps over the lazy dog“; pak případ ve stylu RFC s 16bajtovým klíčem 0x0b a zprávou „Hi There“). Všechny byly vygenerovány nezávislou nativní implementací a na této stránce znovu ověřeny.
HMAC z „fox“, klíč = key | Otisk (hex) |
| HMAC-MD5 | 80070713463e7749b90c2dc24911e275 |
| HMAC-SHA-1 | de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 |
| HMAC-SHA-256 | f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 |
| HMAC-SHA-384 | d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1ae50700582a96cf35e1e554995fe4e03381c237 |
| HMAC-SHA-512 | b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a |
| Kotvy KDF | Parametry | Výstup (hex, první bajty) |
| PBKDF2-HMAC-SHA-1 | heslo / sůl, c=4096, 32 bajtů | 4b007901b765489abead49d926f721d065a429c12e463f6c4cd79401085b03db |
| PBKDF2-HMAC-SHA-256 | heslo / sůl, c=4096, 32 bajtů | c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a |
| HKDF-SHA-256 (RFC 5869 A.1) | IKM=0x0b×22, salt=00..0c, info=f0..f9, L=42 | 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865 |
| HKDF-SHA-256 (RFC 5869 A.2) | IKM=00..4f, salt=60..af, info=b0..ff, L=82 | b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c… |
| HKDF-SHA-256 (RFC 5869 A.3) | IKM=0x0b×22, prázdná sůl a info, L=42 | 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8 |
Časté chyby
- Záměna HMAC za šifrování. HMAC prokazuje integritu a původ (při sdíleném tajemství); nic neskrývá. Každý bez klíče stále vidí celou zprávu.
- Záměna HMAC za podpis. Digitální podpisy jsou s veřejným klíčem: jeden podepisuje, kdokoli ověřuje. HMAC je symetrický: každý ověřovatel by mohl také padělat. Pro nepopiratelnost potřebujete RSA/ECDSA (viz nástroj RSA v této rodině, až bude zveřejněn), ne HMAC.
- Nesoulad při čtení klíče. 64znakový hex řetězec vložený do textového pole klíče se stane 64 bajty, ne 32 — a HMAC se zcela změní. Tato stránka vypisuje způsob čtení ve výstupním řádku; když se dva nástroje neshodnou, je to první věc k porovnání.
- Málo iterací u PBKDF2. 1 000 iterací bylo v roce 2000 rozumných; dnes je spotřebují GPU. Pokud váš systém stále ukládá hashe s 1 000 iteracemi, naplánujte migraci s přehashováním při přihlášení.
- HKDF na heslo. Jeden HMAC na výstupní blok znamená, že heslo projde okamžitě — pro hesla používejte PBKDF2 (nebo Argon2id) a pro tajemství s vysokou entropií HKDF.
- Opakované použití jednoho odvozeného klíče pro všechno. Náprava je zdarma: odvoďte oddělené klíče s různými popisky
info. Dva klíče z jednoho IKM s různými popisky jsou podle návrhu nezávislé.
Časté dotazy
Je HMAC-MD5 prolomený? Jako hash odolný proti kolizím je MD5 mrtvý, ale bezpečnost HMAC-MD5 závisí na MD5 jako pseudonáhodné funkci a žádný praktický zlom není znám. Každopádně je vyřazen — není důvod volit jej před HMAC-SHA-256, kromě kompatibility se starým protokolem.
Jak dlouhý má být můj klíč HMAC? Alespoň tak velký jako výstup hashe (32 bajtů pro SHA-256) a vygenerovaný CSPRNG. Klíč kratší než otisk je povolen, ale každý bit pod touto hodnotou přímo snižuje bezpečnost.
Stává se PBKDF2 s větším počtem iterací „bezpečnějším“ donekonečna? Zvyšuje náklad útočníka lineárně, ale také váš náklad na přihlášení lineárně. Hra spočívá ve volbě největšího počtu, který vaši uživatelé snesou — právě na to kalibrují čísla OWASP.
Proč je HKDF omezeno na 255 × velikost hashe? Smyčka rozšíření je T(i) = HMAC(PRK, T(i-1) || info || i) s jednobajtovým čítačem i — 255 je největší hodnota čítače, tvrdý strukturální limit RFC 5869, nikoli volba politiky.
Jaký je rozdíl mezi PBKDF2 na této stránce a generátorem hashů hesel? Stejný algoritmus, jiný úkol. Tato stránka odvozuje surové bajty klíče k použití jinde; stránka hashů hesel vytváří uložené řetězce přihlašovacích údajů (s vloženou solí a parametry) a ověřuje vložené kandidáty proti nim.