Что это за инструмент?
HMAC расшифровывается как Hash-based Message Authentication Code — код аутентификации сообщений на основе хеша. Он объединяет секретный ключ с сообщением и стандартной хеш-функцией (например, SHA-256), чтобы получить дайджест фиксированной длины. Любой, у кого есть тот же ключ и сообщение, вычислит точно такой же HMAC — но без ключа получить корректный HMAC для сообщения вычислительно неосуществимо, даже если известен используемый алгоритм хеширования.
В этом ключевое отличие от обычного хеша: обычный хеш (MD5, SHA-256 и т. д.) принимает на вход только сообщение, поэтому вычислить его может кто угодно, и он ничего не доказывает о том, кто его создал. HMAC принимает сообщение *и* секретный ключ, поэтому корректный HMAC доказывает, что отправитель владел секретом — это механизм аутентификации, а не просто проверка целостности.
HMAC формально стандартизирован NIST в документе FIPS 198-1 и определён для интернет-протоколов в IETF RFC 2104. Этот инструмент вычисляет HMAC с помощью нативного Web Crypto API вашего браузера (`crypto.subtle.sign` с алгоритмом HMAC), который корректно реализует RFC 2104, а не самописную версию на JavaScript.
Зачем его использовать?
- Пришёл вебхук от Stripe с заголовком X-Stripe-Signature, и прежде чем подозревать серверные логи, хочется вручную воспроизвести вычисление — вводите секретный ключ и payload сюда и сверяете, совпадает ли полученный HMAC-SHA256 со значением заголовка.
- Пишете локально проверку вебхуков для GitHub Apps и не уверены, правильно ли работает логика X-Hub-Signature-256 — заранее считаете ожидаемое значение по известным ключу и payload и сверяете с выводом своего кода при отладке.
- Нужно убедиться, что другая команда правильно реализовала подпись запросов к вашему внутреннему API — передаёте им тот же секретный ключ и сообщение и сразу проверяете, получается ли у обеих сторон одинаковый HMAC.
- Хотите проверить часть подписи HS256 в JWT, не полагаясь вслепую на библиотеку — вставляете в поле сообщения строку из склеенных header и payload и вычисляете HMAC-SHA256 с ключом подписи для сравнения.
- Нужно протестировать с реальным production-ключом, не отправляя ничего сторонним сервисам — все вычисления происходят в браузере, поэтому можно безопасно использовать настоящие секреты.
- Хочется на практике, а не только по документации, увидеть разницу в длине вывода между SHA-1 и SHA-256 — инструмент показывает все четыре алгоритма рядом для одних и тех же ключа и сообщения.
Как использовать
- Введите секретный ключ в поле «Secret Key».
- Введите сообщение, которое нужно аутентифицировать, в поле «Message».
- Результаты HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 и HMAC-SHA512 генерируются мгновенно (отметьте «Uppercase output», если целевая система ожидает заглавные буквы).
- Нажмите «Copy» рядом с нужным значением HMAC.
Пример
Ввод
Secret Key: key
Message: The quick brown fox jumps over the lazy dogРезультат
HMAC-SHA256: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
HMAC-SHA1: de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9Это стандартный опубликованный тестовый вектор: с ключом «key» и этим сообщением HMAC-SHA256 и HMAC-SHA1 всегда дают именно такие значения в любой корректной реализации, так что вы можете независимо проверить вывод этого инструмента.
HMAC против обычного хеша: когда нужен ключ
Решающий вопрос: нужно ли доказать, кто создал этот дайджест, или достаточно убедиться, что содержимое не изменилось? Если хватает публичной контрольной суммы — проверка, что скачанный файл совпадает с тем, что указал издатель, дедупликация записей, — подойдёт обычный хеш, и проверить его сможет кто угодно без ключа. Если же нужно доказать, что дайджест мог создать только владелец конкретного секрета — аутентификация вызывающей стороны API, доверие отправителю вебхука, — нужен HMAC, потому что обычный хеш даёт злоумышленнику без секрета ту же возможность подделать корректный дайджест, что и настоящему отправителю.
→ Генератор хеша для нескольких алгоритмов · Декодер JWT · Генератор MD5
Сравнение четырёх алгоритмов HMAC
Все четыре используют одну и ту же конструкцию HMAC из RFC 2104, отличаясь только базовой хеш-функцией и, соответственно, длиной вывода.
| Алгоритм | Размер вывода | Типичное применение |
|---|---|---|
| HMAC-SHA1 | 160 бит (40 hex-символов) | Устаревшие API, старые подписи OAuth 1.0a |
| HMAC-SHA256 | 256 бит (64 hex-символа) | Подпись API-запросов, JWT HS256, проверка вебхуков |
| HMAC-SHA384 | 384 бита (96 hex-символов) | Подписи с повышенными требованиями, где нужен более длинный вывод |
| HMAC-SHA512 | 512 бит (128 hex-символов) | Дайджесты максимальной длины для приложений с высокими требованиями к безопасности |
Типичные сценарии использования
- Подпись исходящих API-запросов общим секретом, чтобы сервер мог подтвердить личность вызывающей стороны.
- Проверка входящей полезной нагрузки вебхуков (заголовки Stripe-Signature, GitHub X-Hub-Signature-256 и похожие используют HMAC-SHA256).
- Генерация и проверка сигнатурной части JWT, подписанного HS256/HS384/HS512.
- Проверка того, что серверная или клиентская реализация HMAC даёт ожидаемый результат, перед развёртыванием.
На что обратить внимание при проверке подписи вебхука
Многие сервисы подписывают не просто тело запроса как есть, а строку, полученную объединением тела с другими элементами, например с меткой времени. Stripe, например, соединяет метку времени и payload в определённом формате перед подписью, поэтому при воспроизведении проверки в этом инструменте важно свериться с документацией сервиса, чтобы понять, какая именно строка подписывается на самом деле.
Кроме того, если тело запроса — это JSON, разбор и повторная сериализация часто меняют переносы строк и порядок ключей, из-за чего результат перестаёт совпадать с исходной последовательностью байт. При проверке всегда вставляйте в поле сообщения именно «сырое» тело запроса в том виде, в каком оно было получено, — использование уже отформатированной строки даст несовпадение даже при правильной реализации.
Часто задаваемые вопросы
Что такое HMAC?
HMAC (Hash-based Message Authentication Code) объединяет секретный ключ с сообщением через хеш-функцию, чтобы получить дайджест, доказывающий как целостность сообщения, так и владение отправителем ключом. Определён в NIST FIPS 198-1 и IETF RFC 2104.
В чём разница между HMAC и обычным хешем?
Обычный хеш (SHA-256, MD5 и т. д.) принимает на вход только сообщение — вычислить его может кто угодно, поэтому он лишь доказывает, что сообщение не было повреждено, но не то, кто его отправил. HMAC принимает сообщение плюс секретный ключ: если нужно доказать, что сообщение пришло от владельца конкретного секрета (подпись API, отправитель вебхука), нужен именно HMAC. Если требуется лишь убедиться, что файл или сообщение не изменились, и авторство неважно, достаточно обычного хеша.
Отправляется ли мой секретный ключ на сервер?
Нет. Этот инструмент вычисляет HMAC полностью в вашем браузере с помощью Web Crypto API. Ваш ключ и сообщение никуда не передаются — можно безопасно тестировать реальные production-секреты.
Какой алгоритм использовать — SHA-1, SHA-256, SHA-384 или SHA-512?
Используйте HMAC-SHA256, если конкретная система не требует иного — это фактический стандарт для подписи API (используется AWS, Stripe, вебхуками GitHub и большинством современных API) и обеспечивает надёжный запас прочности. HMAC-SHA1 всё ещё встречается в устаревших системах (например, в старых реализациях OAuth 1.0a), но базовый хеш SHA-1 считается слабее; HMAC-SHA384/512 применяют там, где явно требуется более длинный вывод или дополнительный запас надёжности.
Небезопасен ли HMAC-SHA1, раз обычный SHA-1 взломан?
Атаки на коллизии 2017 года взломали SHA-1 именно как обычную хеш-функцию, но HMAC-SHA1 по-прежнему считается криптографически надёжным, поскольку безопасность HMAC не зависит от устойчивости к коллизиям тем же образом. Тем не менее для новых систем лучше выбирать HMAC-SHA256 и выше — практических минусов в этом нет, и вопрос снимается сам собой.
Каковы типичные применения HMAC на практике?
Подпись REST API-запросов, чтобы сервер мог убедиться, что вызывающая сторона владеет общим секретом API; проверка полезной нагрузки вебхуков от таких сервисов, как Stripe, GitHub и Shopify, чтобы убедиться, что запрос действительно пришёл от них и не подделан; генерация одноразовых паролей на основе времени (TOTP/HOTP) для двухфакторной аутентификации; и подпись JWT-токенов алгоритмами HS256/HS384/HS512.
Всегда ли HMAC этого инструмента совпадёт с результатом моего кода при одинаковых ключе и сообщении?
Да. HMAC строго определён в RFC 2104, поэтому при одной и той же хеш-функции (например, SHA-256), одном ключе и одном сообщении любая корректная реализация на любом языке или в любой библиотеке даст ровно тот же результат. Если значения не совпадают, скорее всего, различается кодировка ключа или сообщения (UTF-8 или нет, лишние переносы строк и т. п.).
Какую строку использовать в качестве ключа? Есть ли ограничение по длине?
Ограничения на длину ключа для HMAC нет — можно использовать как короткую строку, так и длинную случайную последовательность. Однако слишком короткий ключ ослабляет безопасность; для продакшена с HMAC-SHA256 обычно рекомендуют случайный ключ длиной около 32 байт (256 бит). Поскольку этот инструмент предназначен для тестирования и проверки, можно вводить любую строку в качестве ключа.
Для чего нужен флажок «Uppercase output»?
По умолчанию HMAC отображается в виде шестнадцатеричной строки в нижнем регистре (0-9, a-f), но некоторые системы или API ожидают заглавные буквы (0-9, A-F). Этот флажок меняет только формат отображения, не затрагивая само значение.
Корректно ли вычисляется HMAC, если сообщение содержит символы других языков?
Да. Этот инструмент кодирует сообщение в UTF-8 перед вычислением HMAC, поэтому любой текст в Unicode — включая символы разных алфавитов — обрабатывается без проблем. Стоит только убедиться, что система на другой стороне использует ту же кодировку, чтобы оба вычисления начинались с одинаковых данных.