Utilia

Generátor HMAC

Vypočítej HMAC-SHA1, SHA-256, SHA-384 nebo SHA-512 s klíčem v textu, hex nebo Base64, získej výstup v hex a Base64 a zkontroluj podpis webhooku v prohlížeči.

Zpráva se podepisuje přesně tak, jak je napsána, v kódování UTF-8, včetně mezer a konců řádků.

Porovnání probíhá v konstantním čase, jak by to měl dělat server, takže doba trvání neprozradí, kolik znaků se shoduje.

Jak vypočítat HMAC

  1. Vlož Zprávu. U webhooku to musí být surové tělo požadavku, bajt po bajtu.
  2. Zadej Tajný klíč a zvol jeho Formát klíče: Text (UTF-8), Šestnáctkově nebo Base64.
  3. Vyber Algoritmus: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 nebo HMAC-SHA512.
  4. Výsledek se aktualizuje při psaní, můžeš také kliknout na Generovat HMAC. Dostaneš HMAC (hex), HMAC (Base64) a Hlavičku podpisu webhooku (ve stylu GitHubu), každý s tlačítkem Kopírovat.
  5. Chceš-li zkontrolovat přijatý podpis, vlož ho do pole Porovnat s očekávaným podpisem (hex, Base64 nebo sha256=…). Nástroj ti řekne, zda odpovídá.

Zpráva se kóduje jako UTF-8 přesně tak, jak je napsána, včetně mezer a konců řádků. Výpočet využívá rozhraní Web Crypto API ve tvém prohlížeči a zpráva ani klíč nikdy neopustí tvoje zařízení.

Co je HMAC

HMAC (hash-based message authentication code, RFC 2104) spojuje tajný klíč s hashovací funkcí:

HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))

kde K′ je klíč doplněný na velikost bloku hashe (nejdřív se zahashuje, pokud je delší) a ipad/opad jsou pevné konstanty. Správný kód pro zprávu dokáže vytvořit jen ten, kdo zná klíč, a jakákoli změna zprávy kód zcela změní. Proto se pomocí HMAC podepisují webhooky, požadavky API (například AWS Signature Version 4) i tokeny JSON Web Token HS256.

HMAC není šifrování: zpráva se neskrývá. Není to ani hash hesla. Na ukládání hesel použij pomalou funkci jako bcrypt nebo Argon2.

Délka výstupu závisí na algoritmu: 20 bajtů u SHA-1, 32 u SHA-256, 48 u SHA-384 a 64 u SHA-512. HMAC-SHA1 se jako MAC stále považuje za bezpečný, ale pro nové systémy dej přednost SHA-256. Doporučuje se náhodný klíč alespoň tak dlouhý jako výstup (32 bajtů u HMAC-SHA256). Klíče v hex nebo Base64 umožňují zadat takové náhodné bajty přímo.

Kontrola webhooku z GitHubu

GitHub podepisuje každé doručení tajným klíčem webhooku a výsledek posílá v hlavičce X-Hub-Signature-256 jako sha256= následované hex hodnotou HMAC-SHA256 těla. Příklad z dokumentace GitHubu používá tajný klíč It's a Secret to Everybody a tělo Hello, World!. Zadej je zde s HMAC-SHA256 a hlavička ukáže:

X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17

Pole pro porovnání přijímá celý řádek hlavičky, hodnotu sha256=… nebo holý podpis v hex či Base64 (Stripe, Shopify a Slack používají podobná schémata s vlastními hlavičkami a podepisovanými řetězci). U SHA-384 a SHA-512 nástroj zobrazuje obecnou hlavičku X-Signature, protože společný standard neexistuje.

Porovnání v konstantním čase

Server, který podpisy porovnává běžným porovnáním řetězců, se zastaví u prvního odlišného znaku. Měřením doby odezvy by útočník mohl platný podpis uhodnout znak po znaku. Porovnání v tomto nástroji prověřuje každý bajt bez ohledu na výsledek, jak by to měl server dělat pomocí crypto.timingSafeEqual v Node.js, hmac.compare_digest v Pythonu nebo hash_equals v PHP.

Časté dotazy

Proč se můj HMAC liší od toho, který spočítal můj server?

Obvyklými příčinami jsou jiná zpráva (server podepisuje surové tělo, ty ses vložil přeformátovaný JSON, nebo se liší konce řádků), klíč ve špatném Formátu klíče či jiný algoritmus. I jedna mezera navíc změní celý výsledek.

Má být výstup v hex, nebo v Base64?

Obojí kóduje stejné bajty. GitHub používá hex, zatímco mnoho jiných API, například Shopify, používá Base64. Použij formát, který očekává přijímající systém.

Mohu použít prázdný klíč?

Nástroj ho přijme a upozorní tě: s prázdným klíčem může stejný HMAC spočítat kdokoli, takže nic nedokazuje.

Je HMAC-SHA1 prolomený jako SHA-1?

Kolizní útoky na SHA-1 HMAC-SHA1 neprolamují, jako MAC se stále považuje za bezpečný. Pro zastaralé systémy, například starou hlavičku X-Hub-Signature, zůstává podporován, ale nové systémy by měly používat HMAC-SHA256 nebo silnější.

Je můj tajný klíč zde v bezpečí?

Klíč i zpráva se zpracovávají jen ve tvém prohlížeči a nikam se neodesílají. Přesto s produkčním tajemstvím zacházej opatrně a pokud si myslíš, že unikl, vyměň ho.