Utilia

HMAC generátor

Számolj HMAC-SHA1, SHA-256, SHA-384 vagy SHA-512 értéket szöveges, hex vagy Base64 kulccsal, és ellenőrizz webhook-aláírást a böngésződben.

Az üzenetet pontosan úgy írjuk alá, ahogy beírtad, UTF-8-ként kódolva, a szóközökkel és sortörésekkel együtt.

Az összehasonlítás állandó idő alatt fut le, ahogy egy szervernek is tennie kell, így az eltelt idő nem árulja el, hány karakter egyezik.

Hogyan számolj HMAC-ot

  1. Illeszd be az Üzenet mezőbe az üzenetet. Webhooknál ennek a kérés nyers törzsének kell lennie, bájtról bájtra.
  2. Add meg a Titkos kulcs értékét, és válaszd ki a Kulcs formátuma beállítást: Szöveg (UTF-8), Hexadecimális vagy Base64.
  3. Válaszd ki az Algoritmus típusát: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 vagy HMAC-SHA512.
  4. Az eredmény gépelés közben frissül; a HMAC generálása gombra is kattinthatsz. Megkapod a HMAC (hex), a HMAC (Base64) és a Webhook-aláírás fejléc (GitHub-stílus) értékét, mindegyiket egy Másolás gombbal.
  5. Egy kapott aláírás ellenőrzéséhez illeszd be az Összehasonlítás egy várt aláírással (hex, Base64 vagy sha256=…) mezőbe. Az eszköz megmondja, hogy egyezik-e.

Az üzenetet az eszköz pontosan úgy kódolja UTF-8-ként, ahogy beírtad, a szóközökkel és sortörésekkel együtt. A számítás a böngésződ Web Crypto API-ját használja; az üzenet és a kulcs soha nem hagyja el az eszközödet.

Mi az a HMAC?

A HMAC (hash-alapú üzenethitelesítő kód, RFC 2104) egy titkos kulcsot kombinál egy hash-függvénnyel:

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

ahol a K′ a hash blokkméretére kiegészített kulcs (ha hosszabb, előbb hasheljük), az ipad/opad pedig rögzített állandók. Csak az tudja előállítani egy üzenethez a helyes kódot, aki ismeri a kulcsot, és az üzenet bármilyen módosítása teljesen megváltoztatja a kódot. Ezért írnak alá HMAC-okkal webhookokat, API-kéréseket (például az AWS Signature Version 4-et) és HS256 JSON Web Tokeneket.

A HMAC nem titkosítás: az üzenet nem rejtett. Nem is jelszó-hash; jelszavak tárolásához használj lassú függvényt, például bcryptet vagy Argon2-t.

A kimenet hossza az algoritmustól függ: SHA-1-nél 20 bájt, SHA-256-nál 32, SHA-384-nél 48, SHA-512-nél 64. A HMAC-SHA1 MAC-ként még biztonságosnak számít, de új rendszerekhez inkább az SHA-256-ot válaszd. Javasolt a kimenet hosszával legalább megegyező hosszú véletlen kulcs (HMAC-SHA256-nál 32 bájt); a hex vagy Base64 kulcsokkal közvetlenül megadhatsz ilyen véletlen bájtokat.

GitHub webhook ellenőrzése

A GitHub minden kézbesítést a webhook titkos kulcsával ír alá, és az eredményt az X-Hub-Signature-256 fejlécben küldi el sha256= előtaggal, amelyet a törzs hex HMAC-SHA256 értéke követ. A GitHub saját dokumentációjának példája az It's a Secret to Everybody titkos kulcsot és a Hello, World! törzset használja; add meg őket itt HMAC-SHA256 algoritmussal, és a fejléc ezt mutatja:

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

Az összehasonlító mező elfogadja a teljes fejlécsort, az sha256=… értéket, vagy egy puszta hex vagy Base64 aláírást (a Stripe, a Shopify és a Slack hasonló sémákat használ saját fejlécekkel és aláírt karakterláncokkal). SHA-384-nél és SHA-512-nél az eszköz általános X-Signature fejlécet mutat, mert nincs közös szabvány.

Állandó idejű összehasonlítás

Az a szerver, amely az aláírásokat egyszerű karakterlánc-összehasonlítással vet össze, az első eltérő karakternél megáll. A válaszidők mérésével egy támadó karakterenként kitalálhatna egy érvényes aláírást. Az eszköz összehasonlítása az eredménytől függetlenül minden bájtot megvizsgál, ahogy egy szervernek is tennie kell a Node.js crypto.timingSafeEqual, a Python hmac.compare_digest vagy a PHP hash_equals függvényével.

Gyakori kérdések

Miért különbözik a HMAC-om a szerverem által számolttól?

A szokásos okok: eltérő üzenet (a szerver a nyers törzset írja alá, te viszont újraformázott JSON-t illesztettél be, vagy a sortörések mások), rossz Kulcs formátuma beállítású kulcs, vagy más algoritmus. Már egyetlen felesleges szóköz is megváltoztatja a teljes eredményt.

Hex vagy Base64 legyen a kimenet?

Mindkettő ugyanazokat a bájtokat kódolja. A GitHub hexet használ, sok más API, például a Shopify, Base64-et. Azt használd, amelyet a fogadó rendszer elvár.

Használhatok üres kulcsot?

Az eszköz elfogadja, és figyelmeztet: üres kulccsal bárki ki tudja számolni ugyanazt a HMAC-ot, így az semmit nem bizonyít.

Feltört a HMAC-SHA1, mint az SHA-1?

Az SHA-1 ütközéses támadásai nem törik fel a HMAC-SHA1-et, amely MAC-ként még biztonságosnak számít. Régi rendszerek, például a régi X-Hub-Signature fejléc miatt támogatott marad, de új rendszerekhez HMAC-SHA256-ot vagy erősebbet használj.

Biztonságban van itt a titkos kulcsom?

A kulcsot és az üzenetet kizárólag a böngésződben dolgozzuk fel, és sehová nem küldjük el. Az éles titkokat azért kezeld óvatosan, és cseréld le, ha úgy gondolod, hogy kiszivárogtak.