HMAC генератор и проверка подписи
Бесплатный онлайн-генератор и верификатор HMAC. Вычисляйте HMAC-SHA256/SHA1/SHA384/SHA512 с ключами в Text, Hex или Base64 и выводом в Hex/Base64/Base64URL. Всё в браузере — ключи не покидают страницу.
Что такое HMAC?
HMAC (Hash-based Message Authentication Code) — это короткий тег фиксированной длины, доказывающий, что сообщение одновременно не изменено и подлинно — что его создал тот, кто владеет общим секретным ключом. Определённый в RFC 2104 и FIPS 198-1, HMAC сочетает любую криптографическую хеш-функцию с секретным ключом в особой вложенной конструкции, записываемой как HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). Внутренний хеш связывает ключ с сообщением; внешний хеш оборачивает результат, и именно это делает HMAC устойчивым к атакам удлинения сообщения, которым подвержены «голые» функции SHA-1 и SHA-256.
HMAC встречается повсюду в современной веб-инфраструктуре. Он подписывает вебхуки, чтобы вы могли убедиться, что входящий запрос действительно пришёл от GitHub, Stripe, Slack или Twilio и не был подделан. Он подписывает API-запросы (AWS Signature Version 4 построена на HMAC-SHA256), чтобы сервер мог аутентифицировать вызывающую сторону, не передавая пароль по сети. Это S в HS256: JWT, подписанный HS256, несёт HMAC-SHA256 над своим заголовком и полезной нагрузкой, которые можно изучить в кодировщике JWT. Он также лежит в основе вывода ключей TLS (HKDF), алгоритмов одноразовых паролей (HOTP/TOTP) и целостности сообщений в бесчисленных внутренних сервисах.
Этот инструмент вычисляет HMAC полностью в вашем браузере с помощью crypto.subtle.sign('HMAC', ...) из Web Crypto API — того же примитива, что браузеры используют во время рукопожатий TLS. Ваш секретный ключ и сообщение никогда не загружаются на сервер, поэтому он безопасен для боевых секретов подписи. Поскольку один и тот же секрет можно выразить как сырой текст, hex или base64, инструмент позволяет явно выбрать кодировку ключа, а поскольку разные провайдеры ожидают тег в разных формах, можно вывести Hex, Base64 или Base64URL. Вкладка «Проверить» позволяет проверить полученную подпись, используя сравнение за постоянное время, чтобы сама проверка не утекала тайминговую информацию.
const crypto = require('crypto');
// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
.createHmac('sha256', 'my-secret-key')
.update('Hello, World!')
.digest('hex');
console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'
// Verify a signature in constant time
function verify(message, key, expectedHex) {
const actual = crypto.createHmac('sha256', key).update(message).digest();
const expected = Buffer.from(expectedHex, 'hex');
return actual.length === expected.length &&
crypto.timingSafeEqual(actual, expected);
} Ключевые возможности
Генерация и проверка в одном инструменте
Сгенерируйте подпись на вкладке «Сгенерировать» или вставьте ожидаемый HMAC на вкладке «Проверить», чтобы аутентифицировать входящий вебхук или токен. Проверка использует сравнение за постоянное время, поэтому результат не утекает тайминговую информацию.
Выбор кодировки ключа
Интерпретируйте свой секрет как Text (UTF-8), Hexadecimal или Base64. Это та настройка, которую большинство других инструментов опускают — и самая частая причина, по которой две системы вычисляют разные HMAC для одного ключа.
Три кодировки вывода
Выводите тег как Hex (вебхуки GitHub, AWS), Base64 (Stripe, Twilio, многие API) или Base64URL (JWT и URL-безопасные токены), чтобы он соответствовал вашей интеграции без ручной конвертации.
Четыре нативных алгоритма
HMAC-SHA256 по умолчанию, плюс SHA-1, SHA-384 и SHA-512. Все работают на Web Crypto API браузера, поэтому нет JavaScript-крипто-библиотеки, которой нужно доверять, и нет потерь в производительности.
100% на стороне клиента и приватно
Ваш секретный ключ и сообщение обрабатываются полностью в вашем браузере и никогда не отправляются на сервер. Откройте вкладку «Сеть» и увидите ноль исходящих запросов — безопасно для боевых секретов подписи.
Вычисление на лету
HMAC мгновенно пересчитывается по мере правки сообщения, ключа, кодировки или алгоритма — без обращения по кнопке «Сгенерировать», так что можно экспериментировать с кодировками, пока ваше значение не совпадёт с серверным.
Построено на проверенных векторах
Вывод сверяется с официальными тестовыми векторами HMAC из RFC 4231, поэтому можно доверять, что дайджесты совпадают с тем, что выдают OpenSSL, модуль crypto в Node и библиотека hmac в Python.
Примеры HMAC
Быстрый старт — HMAC-SHA256, вывод в hex
Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699
С ключом "my-secret-key" (кодировка ключа = Text), алгоритмом HMAC-SHA256 и форматом вывода = Hex сообщение "Hello, World!" даёт cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699. Это канонический 64-символьный hex-дайджест, который вы получите из crypto.createHmac('sha256', key).update(msg).digest('hex') в Node.
Проверка вебхука в стиле Stripe (вывод в Base64)
{"id":42,"event":"user.created"} Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=
Многие провайдеры вебхуков отправляют подпись в Base64. С ключом "whsec_test_secret" (Text), HMAC-SHA256 и форматом вывода = Base64 тело JSON подписывается в Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=. Вставьте это значение на вкладку «Проверить», чтобы убедиться, что запрос действительно пришёл от вашего провайдера, прежде чем его обрабатывать. Внутри HMAC работает поверх того же примитива, что и наш генератор хешей SHA-256, но с ключом из вашего секрета.
Эталонный вектор RFC 4231
what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843
Это тестовый случай 2 из RFC 4231, официального документа с тестовыми векторами HMAC. С ключом "Jefe" (Text), HMAC-SHA256 и выводом в Hex сообщение "what do ya want for nothing?" даёт 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Совпадение с этим точным значением и есть способ доказать, что реализация HMAC корректна.
HMAC-SHA512 для более длинного дайджеста
The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e
Переключите алгоритм на HMAC-SHA512 для дайджеста в 128 символов (512 бит). С ключом "key" (Text) и выводом в Hex строка "The quick brown fox" даёт значение выше. SHA-512 быстрее SHA-256 на большинстве 64-битного оборудования и даёт больший вывод, хотя SHA-256 остаётся стандартом совместимости.
Как сгенерировать и проверить HMAC
- 1
Выберите алгоритм
Возьмите HMAC-SHA256 (по умолчанию и верный выбор почти для всех вебхуков, API и JWT) либо переключитесь на SHA-1, SHA-384 или SHA-512 под систему, которая этого требует. Все четыре работают нативно в вашем браузере через Web Crypto API.
- 2
Введите секретный ключ и задайте его кодировку
Введите или вставьте секретный ключ, затем задайте кодировку ключа в соответствии с тем, как его интерпретирует сервер: Text (UTF-8) для обычной строки, Hex для шестнадцатеричного блока или Base64 для секрета в base64. Ошибка здесь — главная причина несовпадений HMAC, поэтому в случае сомнений попробуйте все три.
- 3
Введите сообщение
Вставьте точные байты, которые хотите подписать — для вебхука это сырое тело запроса, байт в байт, без повторной сериализации и изменений пробелов. HMAC пересчитывается на лету по мере правки, и ничего не отправляется на сервер.
- 4
Выберите формат вывода и скопируйте
Выберите Hex (в стиле GitHub), Base64 (в стиле Stripe/AWS) или Base64URL (в стиле JWT) под то, что ожидает ваша интеграция, затем нажмите «Копировать», чтобы взять подпись.
- 5
Проверьте существующую подпись
Перейдите на вкладку «Проверить», вставьте ожидаемый HMAC из заголовка или токена, и инструмент за постоянное время подтвердит, совпадает ли ваша вычисленная подпись — чтобы вы могли аутентифицировать полезную нагрузку, прежде чем действовать.
Частые ошибки с HMAC
Несовпадение кодировки ключа (причина несовпадений №1)
Один и тот же секрет можно прочитать как сырой текст UTF-8, как hex или как base64 — и каждая интерпретация даёт совершенно разные байты ключа, поэтому HMAC не совпадёт, если ваш инструмент и сервер расходятся. Если провайдер даёт вам hex- или base64-секрет, его нужно декодировать в байты перед подписью, а не подписывать строку как есть. Когда подпись не проходит проверку, сначала попробуйте ключ во всех трёх вариантах кодировки ключа.
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg) // Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg) Несовпадение кодировки вывода
HMAC — это сырые байты; hex, base64 и base64url — лишь разные текстовые кодировки одного и того же значения. Если сервер отправляет подпись в base64, а вы сравниваете её со своим hex-дайджестом, они никогда не совпадут, даже если базовые байты идентичны. Сопоставьте формат вывода с тем, что использует заголовок или токен.
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual = digest('hex') // hex — never matches // Produce the same encoding the provider uses
actual = digest('base64') Подпись пересериализованного JSON вместо сырого тела
Подписи вебхуков покрывают точные байты, отправленные провайдером. Если вы разберёте JSON и пересоберёте его в строку, порядок ключей, пробелы и формат чисел могут измениться, изменив байты и сломав подпись. Всегда применяйте HMAC к сырому телу запроса, захваченному до любого разбора.
// Re-serialization changes the bytes body = JSON.stringify(JSON.parse(rawBody)) verify(hmac(body))
// Sign the raw bytes exactly as received verify(hmac(rawBody))
Использование == вместо сравнения за постоянное время
Сравнение полученной подписи через == или простое равенство строк утекает тайминговую информацию, потому что сравнение останавливается на первом отличающемся байте. За множество попыток атакующий может восстановить валидный тег. Всегда используйте проверку равенства за постоянное время при верификации.
if (received === computed) { /* trust */ } if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ } Для чего используется HMAC
- Проверка подписей вебхуков
- Провайдеры вроде GitHub, Stripe, Slack и Twilio подписывают каждый вебхук с помощью HMAC над телом запроса и секретом, который есть только у вас. Пересчитайте тег и сравните его с заголовком (например, X-Hub-Signature-256), чтобы убедиться, что событие подлинное, прежде чем действовать. Используйте вкладку «Проверить», чтобы сделать это без одноразового кода.
- Подпись API-запросов
- Аутентифицированные API часто требуют, чтобы клиент подписывал запрос (метод, путь, метку времени, тело) общим секретом с помощью HMAC, а не отправлял сам секрет. AWS Signature Version 4 — канонический пример. Этот инструмент позволяет воспроизводить и отлаживать такие подписи шаг за шагом.
- Гарантия целостности сообщения
- Когда вы передаёте токен, cookie или сообщение между сервисами, добавление HMAC позволяет получателю обнаружить любую подмену. Поскольку тег зависит от секрета, атакующий не может пересчитать его после изменения данных — в отличие от обычной контрольной суммы.
- Понять подпись JWT HS256
- JWT, подписанный HS256, — это просто base64url(header) + '.' + base64url(payload), подписанные HMAC-SHA256, а результат выдан в Base64URL. Установите здесь алгоритм SHA-256 и вывод Base64URL, чтобы увидеть, как именно создаётся эта подпись, затем сверьтесь в кодировщике JWT.
- Отладка несовпадающей подписи
- Когда ваш HMAC не совпадает с серверным, этот инструмент — самый быстрый способ изолировать причину: попробуйте ключ как Text, Hex и Base64, переключите вывод между Hex и Base64 и убедитесь, что подписываете точно те же сырые байты — и всё без передеплоя кода.
Как работает HMAC
- Конструкция RFC 2104
- HMAC определяется как H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), где ipad — это повторённый байт 0x36, а opad — повторённый 0x5c, оба до размера блока хеша. Ключ длиннее размера блока сначала хешируется; более короткий ключ дополняется нулями. Именно это двухпроходное вложение даёт HMAC его доказательство безопасности, которое держится, даже если базовый хеш не стоек к коллизиям.
- Почему хеш с ключом лучше обычного хеша
- Обычный хеш доказывает лишь то, что данные не были случайно повреждены, ведь его может пересчитать любой для любого сообщения — включая изменённое. HMAC подмешивает секрет, поэтому валидный тег могут создать только владельцы ключа. Это превращает только целостность в целостность плюс подлинность — то самое свойство, которое реально нужно вебхукам и подписанным запросам.
- Устойчивость к удлинению сообщения
- «Голые» SHA-1, SHA-256 и SHA-512 — это хеши Меркла–Дамгарда, уязвимые к удлинению сообщения: имея H(secret ‖ msg), атакующий может вычислить H(secret ‖ msg ‖ extra), не зная секрета. Наивные схемы «MAC с секретом-префиксом» этим ломаются. Внешний хеш HMAC нейтрализует атаку, и это главная причина использовать HMAC вместо хеширования секрета и сообщения вместе.
- Выбор SHA-256 против SHA-512
- HMAC-SHA256 даёт тег в 256 бит (64 hex-символа) и является стандартом совместимости — быстрый, повсеместный и поддерживаемый везде. HMAC-SHA512 даёт тег в 512 бит (128 hex-символов) и часто быстрее на 64-битных процессорах, поскольку SHA-512 использует 64-битные слова. Берите SHA-256, если спецификация или одноранговая система не требуют SHA-512; оба безопасны для аутентификации.
- Реализация на Web Crypto
- Этот инструмент вызывает crypto.subtle.importKey, чтобы загрузить ваш ключ (декодированный из Text, Hex или Base64), и crypto.subtle.sign('HMAC', ...), чтобы вычислить тег, затем кодирует сырые байты как Hex, Base64 или Base64URL. Это та же нативная, проаудированная реализация, которую браузер использует для TLS, работающая вне движка JavaScript ради скорости.
Лучшие практики HMAC
- Используйте ключ не короче длины вывода хеша
- Для HMAC-SHA256 используйте секрет не менее 32 случайных байт (256 бит); для SHA-512 — 64. Короткий или низкоэнтропийный ключ — самое слабое звено. Генерируйте ключи из криптографически стойкого источника случайности — никогда из пароля или предсказуемой строки.
- Всегда сравнивайте теги за постоянное время
- Проверяйте подписи сравнением за постоянное время (crypto.timingSafeEqual в Node, hmac.compare_digest в Python), а не == или равенством строк. Наивное сравнение завершается рано на первом отличающемся байте, утекая тайминг, который может позволить атакующему восстановить валидный тег байт за байтом. Вкладка «Проверить» этого инструмента уже сравнивает за постоянное время.
- Никогда не логируйте и не раскрывайте секретный ключ
- Держите секреты подписи вне логов, сообщений об ошибках, URL и клиентского кода. Храните их в менеджере секретов или переменных окружения, периодически ротируйте и привязывайте каждую интеграцию к своему ключу, чтобы одна утечка не скомпрометировала всё.
- Предпочитайте HMAC-SHA256 или сильнее
- По умолчанию берите HMAC-SHA256; поднимайтесь до SHA-384 или SHA-512, когда этого требует одноранговая сторона. Избегайте HMAC-SHA1 для новых систем и никогда не используйте HMAC-MD5. Хотя HMAC терпит слабый хеш лучше, чем это сделала бы сырая подпись, старт с современного хеша даёт максимальный запас прочности.
- Подписывайте точные байты, включая метку времени
- Подписывайте сырую, неизменённую полезную нагрузку — повторная сериализация JSON или обрезка пробелов меняет байты и ломает проверку. Для подписи запросов включайте метку времени или nonce в подписываемые данные и отклоняйте устаревшие подписи, чтобы предотвратить атаки повтора.
HMAC FAQ
Что такое HMAC?
Чем HMAC отличается от обычного хеша вроде SHA-256?
Как проверить подпись входящего вебхука?
Какую кодировку ключа и вывода использует мой сервер?
Безопасен ли HMAC-SHA256?
Почему здесь нет HMAC-MD5 или HMAC-SHA-3?
HS256 (HMAC) против RS256 (RSA) — что выбрать для JWT?
Похожие инструменты
Все инструменты →Генератор и проверка bcrypt-хешей
Безопасность
Создавайте и проверяйте bcrypt-хеши паролей онлайн — настраиваемый фактор стоимости, префиксы $2b$/$2a$/$2y$. 100% в браузере; пароль никуда не отправляется.
Декодер JWT
Безопасность
Декодируйте JWT-токены онлайн бесплатно. Просмотр header, payload, signature, срока действия, алгоритма и claims. 100% в браузере — токен не покидает устройство. Без регистрации.
JWT-энкодер и генератор
Безопасность
Бесплатный онлайн-генератор и энкодер JWT. Соберите header и payload, подпишите с HS256, RS256 или ES256 мгновенно. 100% в браузере — ваш секрет и ключ не покидают устройство.
Бесплатный генератор JWT-секрета — HS256/384/512
Безопасность
Создайте надёжный JWT-секрет по RFC для HS256/384/512 — 100% в браузере, ничего не уходит на сервер. base64url, base64 или hex; копия для .env.
Генератор MD5-хешей и контрольных сумм файлов
Безопасность
Создавайте MD5, SHA-256, SHA-1 и SHA-512 хеши онлайн бесплатно. Хеширование текста или файлов в браузере, проверка контрольных сумм и копирование результатов. Без регистрации.
Генератор случайных паролей — настраиваемый и безопасный
Безопасность
Генерируйте сильные случайные пароли мгновенно — бесплатно, 100% в браузере. Настройка длины и символов, batch до 50 с анализом энтропии.