Utilia

Gjeneratori HMAC

Llogarit HMAC-SHA1, SHA-256, SHA-384 ose SHA-512 me çelës tekst, hex ose Base64, merr daljen hex e Base64 dhe kontrollo një nënshkrim webhook në shfletues.

Mesazhi nënshkruhet saktësisht siç është shkruar, i koduar si UTF-8, me hapësira dhe ndarje rreshtash.

Krahasimi bëhet në kohë konstante, siç duhet ta bëjë një server, ndaj koha e shpenzuar nuk tregon sa karaktere përputhen.

Si të llogarisësh një HMAC

  1. Ngjit Mesazhin. Për një webhook, ky duhet të jetë trupi i papërpunuar i kërkesës, bajt për bajt.
  2. Shkruaj Çelësin sekret dhe zgjidh Formatin e çelësit: Tekst (UTF-8), Heksadecimal ose Base64.
  3. Zgjidh Algoritmin: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 ose HMAC-SHA512.
  4. Rezultati përditësohet ndërsa shkruan; mund të klikosh edhe Gjenero HMAC. Merr HMAC (hex), HMAC (Base64) dhe një Titull të nënshkrimit të webhook (stili GitHub), secilin me butonin Kopjo.
  5. Për të kontrolluar një nënshkrim që ke marrë, ngjite te Krahaso me një nënshkrim të pritur (hex, Base64 ose sha256=…). Mjeti thotë nëse përputhet.

Mesazhi kodohet si UTF-8 saktësisht siç është shkruar, me hapësira dhe ndarje rreshtash. Llogaritja përdor API-n Web Crypto të shfletuesit tënd; mesazhi dhe çelësi nuk largohen kurrë nga pajisja jote.

Çfarë është një HMAC

Një HMAC (hash-based message authentication code, RFC 2104) kombinon një çelës sekret me një funksion hash:

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

ku K′ është çelësi i plotësuar deri te madhësia e bllokut të hash-it (fillimisht hashohet, nëse është më i gjatë), dhe ipad/opad janë konstante fikse. Vetëm ai që e njeh çelësin mund të prodhojë kodin e duhur për një mesazh, dhe çdo ndryshim në mesazh e ndryshon kodin krejtësisht. Prandaj HMAC-et nënshkruajnë webhook-e, kërkesa API (për shembull AWS Signature Version 4) dhe JSON Web Tokens HS256.

Një HMAC nuk është enkriptim: mesazhi nuk fshihet. Nuk është as hash fjalëkalimi; për ruajtjen e fjalëkalimeve përdor një funksion të ngadaltë si bcrypt ose Argon2.

Gjatësia e daljes varet nga algoritmi: 20 bajte për SHA-1, 32 për SHA-256, 48 për SHA-384 dhe 64 për SHA-512. HMAC-SHA1 konsiderohet ende i sigurt si MAC, por për sistemet e reja preferoje SHA-256. Rekomandohet një çelës i rastësishëm të paktën aq i gjatë sa dalja (32 bajte për HMAC-SHA256); çelësat hex ose Base64 të lejojnë të shkruash drejtpërdrejt bajte të tillë të rastësishëm.

Kontrolli i një webhook të GitHub

GitHub e nënshkruan çdo dërgim me sekretin e webhook-ut tënd dhe e dërgon rezultatin në titullin X-Hub-Signature-256 si sha256= pasuar nga HMAC-SHA256 hex i trupit. Shembulli i dokumentacionit të vetë GitHub përdor sekretin It's a Secret to Everybody dhe trupin Hello, World!; shkruaji këtu me HMAC-SHA256 dhe titulli shfaq:

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

Fusha e krahasimit pranon të gjithë rreshtin e titullit, vlerën sha256=…, ose një nënshkrim të zhveshur hex ose Base64 (Stripe, Shopify dhe Slack përdorin skema të ngjashme me titujt dhe vargjet e tyre të nënshkruara). Për SHA-384 dhe SHA-512 mjeti shfaq një titull të përgjithshëm X-Signature, pasi nuk ka standard të përbashkët.

Krahasimi në kohë konstante

Një server që krahason nënshkrimet me një krahasim normal vargjesh ndalon te karakteri i parë i ndryshëm. Duke matur kohët e përgjigjes, një sulmues mund të hamendësojë një nënshkrim të vlefshëm një karakter pas tjetri. Krahasimi në këtë mjet shqyrton çdo bajt pavarësisht rezultatit, siç duhet të bëjë një server me crypto.timingSafeEqual në Node.js, hmac.compare_digest në Python ose hash_equals në PHP.

Pyetje të shpeshta

Pse HMAC-u im ndryshon nga ai i llogaritur nga serveri im?

Shkaqet e zakonshme janë një mesazh i ndryshëm (serveri nënshkruan trupin e papërpunuar, ndërsa ti ke ngjitur JSON të riformatuar, ose ndarjet e rreshtave ndryshojnë), një çelës në Formatin e çelësit të gabuar, ose një algoritëm tjetër. Edhe një hapësirë e vetme e tepërt e ndryshon të gjithë rezultatin.

Duhet dalja të jetë hex apo Base64?

Të dyja kodojnë të njëjtat bajte. GitHub përdor hex, ndërsa shumë API të tjera, si Shopify, përdorin Base64. Përdor formatin që pret sistemi marrës.

A mund të përdor një çelës bosh?

Mjeti e pranon dhe të paralajmëron: me çelës bosh, kushdo mund të llogarisë të njëjtin HMAC, ndaj nuk provon asgjë.

A është HMAC-SHA1 i thyer si SHA-1?

Sulmet e përplasjes ndaj SHA-1 nuk e thyejnë HMAC-SHA1, që konsiderohet ende i sigurt si MAC. Mbetet i mbështetur për sisteme të vjetra si titulli i vjetër X-Hub-Signature, por sistemet e reja duhet të përdorin HMAC-SHA256 ose më të fortë.

A është çelësi im sekret i sigurt këtu?

Çelësi dhe mesazhi përpunohen vetëm në shfletuesin tënd dhe nuk dërgohen askund. Prapë, trajtoje me kujdes një sekret prodhimi dhe ndryshoje nëse mendon se është ekspozuar.