Utilia

Генератор HMAC

Обчисліть HMAC-SHA1, SHA-256, SHA-384 чи SHA-512 із ключем у вигляді тексту, hex або Base64 та перевірте підпис вебхука у браузері.

Повідомлення підписується точно так, як введено, у кодуванні UTF-8, разом із пробілами й переносами рядків.

Порівняння виконується за сталий час, як і має робити сервер, тож витрачений час не виказує, скільки символів збігається.

Як обчислити HMAC

  1. Вставте Повідомлення. Для вебхука це має бути необроблене тіло запиту, байт у байт.
  2. Введіть Секретний ключ і виберіть його Формат ключа: Текст (UTF-8), Шістнадцятковий або Base64.
  3. Виберіть Алгоритм: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 чи HMAC-SHA512.
  4. Результат оновлюється під час введення; також можна натиснути Згенерувати HMAC. Ви отримаєте HMAC (hex), HMAC (Base64) і Заголовок підпису вебхука (у стилі GitHub), кожен із кнопкою Копіювати.
  5. Щоб перевірити отриманий підпис, вставте його в поле Порівняти з очікуваним підписом (hex, Base64 або sha256=…). Інструмент покаже, чи він збігається.

Повідомлення кодується в UTF-8 точно так, як введено, разом із пробілами й переносами рядків. Обчислення використовує API Web Crypto вашого браузера; повідомлення й ключ ніколи не залишають ваш пристрій.

Що таке HMAC

HMAC (hash-based message authentication code, RFC 2104) поєднує секретний ключ із хеш-функцією:

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

де K′ – ключ, доповнений до розміру блока хешу (спершу хешується, якщо довший), а ipad/opad – фіксовані константи. Лише той, хто знає ключ, може створити правильний код для повідомлення, а будь-яка зміна повідомлення повністю змінює код. Саме тому HMAC підписують вебхуки, запити 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

GitHub підписує кожну доставку вашим секретом вебхука й надсилає результат у заголовку 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 чи сильніший.

Чи безпечний мій секретний ключ тут?

Ключ і повідомлення обробляються лише у вашому браузері й нікуди не надсилаються. Попри це, обережно поводьтеся з робочим секретом і змініть його, якщо вважаєте, що він міг бути розкритий.