Utilia

HMAC генератор

Пресметајте HMAC-SHA1, SHA-256, SHA-384 или SHA-512 со клуч како текст, hex или Base64, добијте hex и Base64 излез и проверете потпис на webhook.

Пораката се потпишува точно како што е внесена, кодирана како UTF-8, вклучително празни места и нови редови.

Споредбата се извршува за константно време, како што треба да го прави серверот, па потрошеното време не открива колку знаци се совпаѓаат.

Како да пресметате HMAC

  1. Залепете ја Порака. За webhook, тоа мора да биде суровото тело на барањето, бајт по бајт.
  2. Внесете го Таен клуч и изберете го неговиот Формат на клучот: Текст (UTF-8), Хексадецимално или Base64.
  3. Изберете Алгоритам: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 или HMAC-SHA512.
  4. Резултатот се освежува додека пишувате; можете да кликнете и Генерирај HMAC. Добивате HMAC (hex), HMAC (Base64) и Заглавие со потпис на webhook (стил на GitHub), секое со копче Копирај.
  5. За да проверите примен потпис, залепете го во Споредете со очекуван потпис (hex, Base64 или sha256=…). Алатката кажува дали се совпаѓа.

Пораката се кодира како UTF-8 точно како што е внесена, вклучително празни места и нови редови. Пресметката го користи Web Crypto API на вашиот прелистувач; пораката и клучот никогаш не го напуштаат вашиот уред.

Што е HMAC

HMAC (hash-based message authentication code, RFC 2104) комбинира таен клуч со хеш функција:

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

каде што K′ е клучот дополнет до големината на блокот на хешот (прво се хешира ако е подолг), а ipad/opad се фиксни константи. Само оној што го знае клучот може да го создаде точниот код за порака, а секоја промена на пораката го менува кодот целосно. Затоа HMAC ги потпишува webhook-овите, API барањата (на пример AWS Signature Version 4) и JSON Web Token со HS256.

HMAC не е шифрирање: пораката не е скриена. Не е ни хеш на лозинка; за чување лозинки користете бавна функција како bcrypt или Argon2.

Должината на излезот зависи од алгоритамот: 20 бајти за SHA-1, 32 за SHA-256, 48 за SHA-384 и 64 за SHA-512. HMAC-SHA1 сè уште се смета за безбеден како MAC, но за нови системи претпочитајте SHA-256. Се препорачува случаен клуч најмалку долг колку излезот (32 бајти за HMAC-SHA256); клучевите во hex или Base64 ви дозволуваат директно да внесете такви случајни бајти.

Проверка на GitHub webhook

GitHub го потпишува секое испорачување со вашата тајна на webhook и го испраќа резултатот во заглавието X-Hub-Signature-256 како sha256= проследено со hex HMAC-SHA256 на телото. Примерот од документацијата на GitHub ја користи тајната It's a Secret to Everybody и телото Hello, World!; внесете ги овде со HMAC-SHA256 и заглавието прикажува:

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

Полето за споредба го прифаќа целиот ред на заглавието, вредноста sha256=… или голиот hex или Base64 потпис (Stripe, Shopify и Slack користат слични шеми со свои заглавија и потпишани низи). За SHA-384 и SHA-512 алатката прикажува општо заглавие X-Signature, бидејќи нема заеднички стандард.

Споредба за константно време

Серверот што ги споредува потписите со обична споредба на низи запира на првиот различен знак. Мерејќи го времето на одговор, напаѓачот би можел да погодува валиден потпис знак по знак. Споредбата во оваа алатка го проверува секој бајт без оглед на резултатот, како што треба да го прави серверот со crypto.timingSafeEqual во Node.js, hmac.compare_digest во Python или hash_equals во PHP.

Често поставувани прашања

Зошто мојот HMAC се разликува од оној што го пресметува мојот сервер?

Вообичаени причини се друга порака (серверот го потпишува суровото тело, а вие залепивте повторно форматиран JSON или нови редови се разликуваат), клуч во погрешен Формат на клучот или друг алгоритам. Дури и едно вишок празно место го менува целиот резултат.

Дали излезот треба да биде hex или Base64?

И двата ги кодираат истите бајти. GitHub користи hex, а многу други API, како Shopify, користат Base64. Користете го форматот што го очекува системот што прима.

Може ли да користам празен клуч?

Алатката го прифаќа и ве предупредува: со празен клуч секој може да го пресмета истиот HMAC, па не докажува ништо.

Дали HMAC-SHA1 е скршен како SHA-1?

Нападите со колизии врз SHA-1 не го кршат HMAC-SHA1, кој сè уште се смета за безбеден како MAC. Останува поддржан за стари системи како старото заглавие X-Hub-Signature, но новите системи треба да користат HMAC-SHA256 или посилен.

Дали е безбеден мојот таен клуч овде?

Клучот и пораката се обработуваат само во вашиот прелистувач и никогаш не се испраќаат никаде. Сепак, внимавајте со производствена тајна и сменете ја ако мислите дека е изложена.