Utilia

HMAC Generator

Kalkulahin ang HMAC-SHA1, SHA-256, SHA-384 o SHA-512 gamit ang text, hex o Base64 na key, kumuha ng hex at Base64 na output, at i-check ang webhook signature.

Pinipirmahan ang mensahe nang eksakto kung paano na-type, naka-encode bilang UTF-8, kasama ang mga espasyo at line break.

Tumatakbo ang paghahambing sa constant time, gaya ng dapat gawin ng server, kaya hindi isinisiwalat ng tagal kung ilang character ang tugma.

Paano kalkulahin ang HMAC

  1. I-paste ang Mensahe. Para sa webhook, dapat ito ang raw na request body, byte por byte.
  2. Ilagay ang Secret key at piliin ang Format ng key: Text (UTF-8), Hexadecimal o Base64.
  3. Piliin ang Algorithm: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 o HMAC-SHA512.
  4. Nag-a-update ang resulta habang nagta-type ka; puwede mo ring i-click ang Gumawa ng HMAC. Makukuha mo ang HMAC (hex), ang HMAC (Base64) at isang Webhook signature header (istilo ng GitHub), bawat isa ay may button na Kopyahin.
  5. Para i-check ang natanggap mong signature, i-paste ito sa Ihambing sa inaasahang signature (hex, Base64 o sha256=…). Sasabihin ng tool kung tugma ito.

Ine-encode ang mensahe bilang UTF-8 nang eksakto kung paano na-type, kasama ang mga espasyo at line break. Gumagamit ang kalkulasyon ng Web Crypto API ng iyong browser; hindi umaalis sa iyong device ang mensahe at ang key.

Ano ang HMAC

Ang HMAC (hash-based message authentication code, RFC 2104) ay nagsasama ng secret key at hash function:

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

kung saan ang K′ ay ang key na pinahaba hanggang sa laki ng block ng hash (hina-hash muna kung mas mahaba), at ang ipad/opad ay mga nakapirming constant. Ang nakakaalam lang ng key ang makakagawa ng tamang code para sa isang mensahe, at ang anumang pagbabago sa mensahe ay lubos na nagbabago sa code. Kaya ginagamit ang mga HMAC sa pagpirma ng mga webhook, API request (halimbawa AWS Signature Version 4) at HS256 JSON Web Token.

Hindi encryption ang HMAC: hindi nakatago ang mensahe. Hindi rin ito password hash; para mag-imbak ng mga password, gumamit ng mabagal na function gaya ng bcrypt o Argon2.

Nakadepende sa algorithm ang haba ng output: 20 byte para sa SHA-1, 32 para sa SHA-256, 48 para sa SHA-384 at 64 para sa SHA-512. Itinuturing pa ring ligtas ang HMAC-SHA1 bilang MAC, pero mas mainam ang SHA-256 para sa mga bagong sistema. Inirerekomenda ang random na key na kasing-haba man lang ng output (32 byte para sa HMAC-SHA256); hinahayaan ka ng mga hex o Base64 na key na ilagay nang direkta ang ganitong mga random na byte.

Pag-check ng GitHub webhook

Pinipirmahan ng GitHub ang bawat delivery gamit ang iyong webhook secret at ipinapadala ang resulta sa header na X-Hub-Signature-256 bilang sha256= na sinusundan ng hex na HMAC-SHA256 ng body. Ang halimbawa sa sariling dokumentasyon ng GitHub ay gumagamit ng secret na It's a Secret to Everybody at body na Hello, World!; ilagay ang mga ito rito gamit ang HMAC-SHA256 at ipapakita ng header ang:

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

Tumatanggap ang comparison field ng buong linya ng header, ng halagang sha256=…, o ng payak na hex o Base64 na signature (gumagamit ang Stripe, Shopify at Slack ng katulad na mga iskema na may sarili nilang header at pinirmahang string). Para sa SHA-384 at SHA-512, nagpapakita ang tool ng pangkalahatang header na X-Signature, dahil walang karaniwang pamantayan.

Constant-time na paghahambing

Ang server na naghahambing ng mga signature gamit ang normal na paghahambing ng string ay humihinto sa unang magkaibang character. Sa pagsukat ng oras ng response, maaaring hulaan ng umaatake ang valid na signature nang isang character bawat beses. Sinusuri ng paghahambing sa tool na ito ang bawat byte anuman ang resulta, gaya ng dapat gawin ng server gamit ang crypto.timingSafeEqual sa Node.js, hmac.compare_digest sa Python o hash_equals sa PHP.

Mga madalas itanong

Bakit iba ang HMAC ko sa kinalkula ng aking server?

Ang mga karaniwang sanhi ay ibang mensahe (pinipirmahan ng server ang raw na body, habang ang na-paste mo ay JSON na nai-format ulit, o magkaiba ang mga line break), key na nasa maling Format ng key, o ibang algorithm. Kahit isang sobrang espasyo ay nagbabago sa buong resulta.

Dapat bang hex o Base64 ang output?

Parehong nag-e-encode ng iisang mga byte. Gumagamit ng hex ang GitHub, habang maraming ibang API, gaya ng Shopify, ay gumagamit ng Base64. Gamitin ang format na inaasahan ng tumatanggap na sistema.

Puwede ba akong gumamit ng walang laman na key?

Tinatanggap ito ng tool at binabalaan ka: kapag walang laman ang key, kahit sino ay makakakalkula ng parehong HMAC, kaya wala itong napapatunayan.

Sira rin ba ang HMAC-SHA1 gaya ng SHA-1?

Hindi sinisira ng mga collision attack sa SHA-1 ang HMAC-SHA1, na itinuturing pa ring ligtas bilang MAC. Suportado pa rin ito para sa mga lumang sistema gaya ng lumang header na X-Hub-Signature, pero dapat gumamit ang mga bagong sistema ng HMAC-SHA256 o mas malakas.

Ligtas ba ang secret key ko rito?

Sa iyong browser lang pino-proseso ang key at mensahe at hindi kailanman ipinapadala kahit saan. Gayunpaman, ingatan ang production secret at palitan ito kung sa tingin mo ay nalantad ito.