Обчисліть HMAC або перевірте підпис, який надіслав вебхук
Цей HMAC генератор підписує повідомлення секретним ключем за допомогою HMAC-SHA256, HMAC-SHA1, HMAC-SHA384 або HMAC-SHA512 і одразу показує підпис у hex малими та великими літерами, у Base64 і в Base64url. Ключ і повідомлення можна ввести як звичайний текст, hex або Base64, тож інструмент працює і з сирими двійковими секретами, і з паролями. Вставте отриманий підпис — <code>sha256=…</code> від GitHub, заголовок Stripe <code>t=…,v1=…</code> або просто Base64 — і ви дізнаєтеся, чи він збігається. Обчислення виконує Web Crypto API вашого браузера; ключ і повідомлення ніколи не залишають сторінку.
Як створити або перевірити HMAC
- 1Виберіть геш-функцію: SHA-256 використовує більшість API і вебхуків.
- 2Введіть або вставте секретний ключ і вкажіть, як він записаний: текст, hex або Base64. Кнопка Випадковий ключ створить новий секрет потрібної довжини.
- 3Вставте повідомлення — для вебхука це сире тіло запиту саме в тому вигляді, в якому воно надійшло, байт у байт.
- 4Скопіюйте підпис у потрібному кодуванні. Щоб перевірити підпис, вставте його в поле Очікуваний підпис; префікс на кшталт
sha256=розпізнається й ігнорується.
Що таке HMAC?
HMAC (hash-based message authentication code, RFC 2104) — це коротке значення, обчислене з повідомлення і секретного ключа. Будь-хто, хто знає ключ, може обчислити те саме значення і так перевірити одразу дві речі: що повідомлення не змінили дорогою і що його створив власник ключа. Без ключа зловмисник не може ні підробити правильний HMAC для нового повідомлення, ні підігнати наявний після зміни повідомлення.
Це не просто геш склеєних ключа й повідомлення. HMAC гешує двічі, підмішуючи ключ у внутрішнє і зовнішнє доповнення: H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ message)). Саме ця конструкція робить його безпечним із SHA-256 і SHA-512, які самі по собі вразливі до атаки подовження повідомлення (length extension), якщо використовувати їх як H(key ‖ message).
Перевірка підписів вебхуків
Більшість провайдерів вебхуків підписують кожен запит HMAC від тіла і кладуть результат у заголовок. Щоб перевірити підпис, обчисліть HMAC від сирого тіла зі своїм секретом підпису і порівняйте зі значенням заголовка. Найчастіша помилка — гешувати заново серіалізований JSON-об'єкт замість байтів, що надійшли: інший порядок ключів або пропущений пробіл повністю змінюють підпис.
Деякі провайдери підписують не лише тіло. Stripe підписує timestamp.body — значення t із заголовка, крапку, а потім payload, — а Slack підписує v0:timestamp:body. Складіть тут саме такий рядок як повідомлення і вставте заголовок повністю в поле перевірки; значення v1= або v0= буде вилучено з нього.
- GitHub
- <code>X-Hub-Signature-256: sha256=<hex></code>, HMAC-SHA256 від тіла із секретом вебхука як текстом.
- Stripe
- <code>Stripe-Signature: t=…,v1=<hex></code>, HMAC-SHA256 від <code>t.body</code>.
- Shopify
- <code>X-Shopify-Hmac-Sha256: <Base64></code>, HMAC-SHA256 від тіла.
- Slack
- <code>X-Slack-Signature: v0=<hex></code>, HMAC-SHA256 від <code>v0:timestamp:body</code>.
Ключі у вигляді тексту, hex і Base64
Ключ — це послідовність байтів, і важливо, як його записано. Текст abc123 — це шість байтів, а hex abc123 — три зовсім інші байти. Багато сервісів видають секрети як рядки hex або Base64, але очікують, що ви використаєте сам рядок як текстовий ключ (так роблять і GitHub, і Stripe), а інші, наприклад ланцюжки підпису в стилі AWS і проксі застосунків Shopify, використовують декодовані байти. Якщо підпис не збігається, насамперед спробуйте змінити кодування ключа.
Для нового ключа використовуйте випадкові байти завдовжки не менше за вихід гешу: 32 байти для HMAC-SHA256, 64 для HMAC-SHA512. Довший ключ нічого не додає — усе, що довше за розмір блоку гешу, спершу гешується.
Порівняння за сталий час
Коли ваш сервер перевіряє підпис, порівнюйте його функцією зі сталим часом виконання, наприклад crypto.timingSafeEqual у Node.js, hmac.compare_digest у Python або hash_equals у PHP. Звичайне порівняння рядків зупиняється на першому відмінному символі, і витрачений час може видати, яка частина підробленого підпису була правильною. Ця сторінка використовує той самий прийом зі сталим часом, тож код слугує не лише перевіркою, а й зразком.
Якщо вам потрібна звичайна контрольна сума файлу чи тексту без ключа, скористайтеся генератором гешів. Для підпису токенів генератор JWT-секрету створює ключі HS256 потрібного розміру.
Поширені запитання
- Чим геш відрізняється від HMAC?
- Геш на кшталт SHA-256 залежить лише від даних, тому його може переобчислити будь-хто. HMAC залежить ще й від секретного ключа, тому створити або перевірити його може лише власник ключа. Тож HMAC підтверджує справжність, а не тільки цілісність.
- Чому мій HMAC не збігається з HMAC від API?
- Майже завжди відрізняються вхідні дані: повідомлення не збігається байт у байт із сирим тілом (заново серіалізований JSON, переведення рядка в кінці, інші закінчення рядків), ключ читається як текст, хоча сервіс має на увазі байти hex чи Base64, або навпаки, чи провайдер підписує мітку часу разом із тілом, а не саме тіло.
- Який алгоритм HMAC вибрати?
- HMAC-SHA256 — стандартний вибір, його використовують майже всі API. HMAC-SHA512 анітрохи не гірший і швидший на 64-бітних серверах. HMAC-SHA1 досі безпечний як HMAC, попри колізії SHA-1, але використовуйте його, лише якщо цього вимагає протокол.
- HMAC-SHA1 зламаний?
- Ні. Колізії SHA-1 не дають змоги підробити HMAC-SHA1 без ключа, і практичних атак на HMAC-SHA1 не відомо. Для нових систем його не рекомендують, але перевіряти старі підписи HMAC-SHA1 безпечно.
- Чи можна тут обчислити HMAC-MD5?
- Ні. Web Crypto API браузера, яким користується ця сторінка, не підтримує MD5. HMAC-MD5 лишився тільки в старих протоколах; для всього нового використовуйте HMAC-SHA256.
- Якої довжини має бути ключ HMAC?
- Не коротший за вихід гешу: 32 випадкові байти для HMAC-SHA256, 48 для SHA-384, 64 для SHA-512. Кнопка «Випадковий ключ» генерує саме стільки за допомогою криптостійкого генератора випадкових чисел вашого браузера.
- Чи можна використати порожній ключ?
- HMAC це дозволяє, і результат чітко визначений, тому інструмент його показує, але порожній або короткий ключ не дає жодного захисту. Той самий підпис зможе обчислити будь-хто.
- Чи надсилається мій секретний ключ кудись?
- Ні. HMAC обчислює Web Crypto API вашого браузера на цій сторінці. Нічого з того, що ви вводите, не завантажується і не зберігається.