Prvý riadok zaznamenáva presné použité parametre (algoritmus, čítanie, veľkosti vstupov), takže skopírovaný výsledok je vždy reprodukovateľný.
HMAC, PBKDF2 a HKDF — kľúčové hashovanie vysvetlené od začiatku
Jednou vetou: holý hash ako SHA-256 môže vypočítať ktokoľvek, takže nič nedokazuje o tom, kto správu poslal — HMAC primieša tajný kľúč, takže odtlačok môžu vytvoriť alebo overiť iba držitelia kľúča; PBKDF2 a HKDF potom znovu používajú ten istý mechanizmus HMAC na premenu tajomstiev na kľúče, pomaly pre heslá a rýchlo pre už náhodný materiál.
Čo je HMAC (RFC 2104)
Konštrukcia. HMAC sú dva behy hashu, nie jeden. Kľúč sa doplní na veľkosť bloku hashu (64 bajtov pre MD5/SHA-1/SHA-256, 128 pre SHA-384/512); správa sa raz zahashuje s kľúčom XOR pevnou vnútornou výplňou a tento odtlačok sa znova zahashuje s kľúčom XOR pevnou vonkajšou výplňou. Táto dvojitá obálka je dokázateľne bezpečná, pokiaľ je základný hash slušná pseudonáhodná funkcia — preto HMAC-MD5 stále odolá praktickým kolíznym útokom, ktoré lámali obyčajný MD5 (aj keď je aj tak vyradený, nižšie).
Kľúče. Funguje ľubovoľná dĺžka kľúča: kratší než veľkosť bloku sa použije tak, ako je (ale pod 32 bajtov sa to nepovažuje za vhodné), dlhší sa najprv zahashuje. Tá istá stránka umožňuje zadať kľúč ako text, hex alebo Base64, aby sa dal vložiť 64-znakový hexadecimálny produkčný kľúč bez toho, aby ho niekto zamenil za 64-znakové textové heslo — čítanie sa zaznamená do výstupného riadku práve z tohto dôvodu.
Kde sa s ním možno stretnúť. Pole HS256 v hlavičke JWT je doslovne HMAC-SHA-256 nad časťami tokenu kódovanými base64url (Dekodér JWT na tomto webe presne to vypočíta, keď sa vloží tajný kľúč HS256). Podpisy webhookov (Stripe, GitHub), AWS SigV4, ochrana záznamov TLS (staršie verzie) a príbuzný umac-64@openssh.com v OpenSSH patria do tej istej rodiny.
Prečo nestačí hash(správa || kľúč)? Rozšírenie dĺžky: každý hash z rodiny MD5/SHA-1/SHA-2 umožňuje útočníkovi, ktorý pozná H(tajomstvo || správa), vypočítať H(tajomstvo || správa || výplň || čokoľvek) bez tajomstva. Rozdelenie na vnútornú a vonkajšiu časť v HMAC túto triedu útokov zrušuje. Je to najčastejšia domácu chyba v kóde na podpisovanie API — a dôvod, prečo HMAC existuje.
Čo je PBKDF2 (RFC 8018)
Pomalé zámerne. Heslo má možno 40 bitov skutočnej entropie; GPU útočníka skúša miliardy surových SHA-256 za sekundu. PBKDF2 spúšťa HMAC(heslo, soľ) opakovane — iter-krát — takže každý odhad stojí rovnaký počet HMAC pre obranu aj pre útočníka. Predvolená hodnota je tu 600 000 iterácií s HMAC-SHA-256, základ OWASP Password Storage Cheat Sheet; posúvač ide až do desiatok miliónov, pretože bezpečnostné odporúčania rastú spolu s rýchlosťou hardvéru.
Soľ. Náhodná soľ pre každé heslo znamená, že rovnakí používatelia už nehashujú identicky a predvypočítané tabuľky (dúhové tabuľky) sa stávajú bezcennými. Nie je tajná — ukladá sa vedľa hashu — musí byť iba jedinečná. Normou je 16 náhodných bajtov.
Známa slabina. PBKDF2 je náročný na CPU, ale nie na pamäť: GPU a ASIC ho paralelizujú veľmi dobre. Preto je moderná rada scrypt alebo Argon2id tam, kde sa navrhuje ukladanie hashov hesiel (generátor hashov hesiel v tejto rodine ich pokrýva) a PBKDF2 zostáva správnou odpoveďou kvôli kompatibilite a nastaveniam FIPS-140.
Čo je HKDF (RFC 5869)
Najprv extrakcia, potom rozšírenie. HKDF má dve úlohy. Extrakcia: stlačí možno nerovnomerný vstupný kľúčový materiál (napríklad zdieľaný tajný kľúč Diffie–Hellman) spolu so soľou do jedného krátkeho pseudonáhodného kľúča PRK = HMAC(salt, IKM). Rozšírenie: roztiahne tento PRK na ľubovoľnú dĺžku až do 255 hashových blokov, pričom každý výstupný blok je zreťazený s predchádzajúcim a označený poľom info. Výsledkom je, že jedno tajomstvo môže bezpečne dať kľúč na šifrovanie, kľúč MAC a IV, všetky oddelené.
Nie na heslá. HKDF predpokladá, že jeho vstup už má plnú entropiu — robí jeden HMAC na každých 32 výstupných bajtov, takže ľudské heslo prejde cez ňu prakticky hneď, presne to, čo útočník chce. Prepúšťanie hesiel cez HKDF namiesto PBKDF2 je klasická konštrukčná chyba; pole info slúži na označenia účelu ("client traffic key", "server iv"), nie na dodatočnú entropiu.
Kde sa s ním možno stretnúť. TLS 1.3 odvodzuje všetky kľúče, ktoré používa, zo sekretu handshake cez HKDF; WireGuard, Signal, EAP-TLS 1.3 a JSON Web Encryption (ako priamy KDF dohody kľúčov) sa všetky nachádzajú na tom istom rodokmeni.
Kotvy overenia — reprodukovanie na tejto stránke
Prvé dve tabuľky sú testovacie vektory, na ktorých stojí tlačidlo Ukážka a sebakontrola tejto stránky (kľúč "key", správa „The quick brown fox jumps over the lazy dog“; potom prípad v štýle RFC s 16-bajtovým kľúčom 0x0b a správou „Hi There“). Všetky boli vygenerované nezávislou natívnou implementáciou a znova overené na tejto stránke.
HMAC „fox“, kľúč = key | Odtlačok (hex) |
| HMAC-MD5 | 80070713463e7749b90c2dc24911e275 |
| HMAC-SHA-1 | de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 |
| HMAC-SHA-256 | f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 |
| HMAC-SHA-384 | d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1ae50700582a96cf35e1e554995fe4e03381c237 |
| HMAC-SHA-512 | b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a |
| Referenčné hodnoty KDF | Parametre | Výstup (hex, prvé bajty) |
| PBKDF2-HMAC-SHA-1 | heslo / soľ, c=4096, 32 bajtov | 4b007901b765489abead49d926f721d065a429c12e463f6c4cd79401085b03db |
| PBKDF2-HMAC-SHA-256 | heslo / soľ, c=4096, 32 bajtov | c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a |
| HKDF-SHA-256 (RFC 5869 A.1) | IKM=0x0b×22, soľ=00..0c, info=f0..f9, L=42 | 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865 |
| HKDF-SHA-256 (RFC 5869 A.2) | IKM=00..4f, soľ=60..af, info=b0..ff, L=82 | b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c… |
| HKDF-SHA-256 (RFC 5869 A.3) | IKM=0x0b×22, prázdna soľ a info, L=42 | 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8 |
Časté chyby
- Zamieňanie HMAC so šifrovaním. HMAC dokazuje integritu a pôvod (pri zdieľanom tajomstve); nič neskrýva. Ktokoľvek bez kľúča stále vidí celú správu.
- Zamieňanie HMAC s podpisom. Digitálne podpisy sú s verejným kľúčom: jeden podpisuje, ktokoľvek overuje. HMAC je symetrický: každý overovateľ by mohol aj sfalšovať. Na nepopierateľnosť treba RSA/ECDSA (súvisiace: nástroj RSA v tejto rodine, keď bude zverejnený), nie HMAC.
- Nesúlady pri čítaní kľúča. Šestnásťkový reťazec so 64 znakmi vložený do poľa textového kľúča sa stane 64 bajtmi, nie 32 — a HMAC sa úplne zmení. Táto stránka vypíše čítanie do výstupného riadku; keď sa dva nástroje nezhodujú, je to prvá vec na porovnanie.
- Príliš nízky počet iterácií PBKDF2. 1 000 iterácií bolo v roku 2000 rozumných; dnes ich GPU zvládnu hneď. Ak systém stále ukladá hashe s 1 000 iteráciami, treba naplánovať migráciu s prehashovaním pri prihlásení.
- HKDF na heslo. Jeden HMAC na každý výstupný blok znamená, že heslo prejde hneď — na heslá sa používa PBKDF2 (alebo Argon2id) a HKDF na tajomstvá s vysokou entropiou.
- Opätovné použitie jedného odvodeného kľúča na všetko. Náprava je zadarmo: odvodia sa oddelené kľúče s rôznymi štítkami
info. Dva kľúče z jedného IKM s rôznymi štítkami sú navrhnuté tak, aby boli nezávislé.
FAQ
Je HMAC-MD5 prelomený? Ako hash odolný voči kolíziám je MD5 mŕtvy, ale bezpečnosť HMAC-MD5 závisí od MD5 ako pseudonáhodnej funkcie a nie je známe žiadne praktické prelomenie. Aj tak je vyradený — nie je dôvod preň vyberať namiesto HMAC-SHA-256, okrem kompatibility so starým protokolom.
Ako dlhý by mal byť kľúč HMAC? Aspoň takú veľkosť, aká je výstup hashu (32 bajtov pre SHA-256), a generovaný generátorom CSPRNG. Kľúč kratší než odtlačok je povolený, ale každý bit pod touto hranicou priamo znižuje bezpečnosť.
Stáva sa PBKDF2 s väčším počtom iterácií „bezpečnejším“ donekonečna? Zvyšuje to náklady útočníka lineárne, ale aj náklady na prihlásenie lineárne. Ide o zvolenie najväčšieho počtu, ktorý používatelia tolerujú — na to kalibrujú čísla OWASP.
Prečo je HKDF obmedzené na 255 × veľkosť hashu? Slučka rozšírenia je T(i) = HMAC(PRK, T(i-1) || info || i) s jednobajtovým počítadlom i — 255 je najväčšia hodnota počítadla, pevný štrukturálny limit RFC 5869, nie voľba politiky.
Aký je rozdiel medzi PBKDF2 na tejto stránke a Generátorom hashov hesiel? Rovnaký algoritmus, iná úloha. Táto stránka odvodí surové bajty kľúča na použitie inde; stránka hashov hesiel vytvára uložené reťazce poverení (s vloženou soľou a parametrami) a overuje vložené kandidáty voči nim.