Skip to content

HMAC генератор и проверка подписи

Бесплатный онлайн-генератор и верификатор HMAC. Вычисляйте HMAC-SHA256/SHA1/SHA384/SHA512 с ключами в Text, Hex или Base64 и выводом в Hex/Base64/Base64URL. Всё в браузере — ключи не покидают страницу.

Без отслеживания Работает в браузере Бесплатно
100% в вашем браузере — ваше сообщение и секретный ключ никогда не покидают ваше устройство.
Сгенерированный HMAC

Что такое 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. 1

    Выберите алгоритм

    Возьмите HMAC-SHA256 (по умолчанию и верный выбор почти для всех вебхуков, API и JWT) либо переключитесь на SHA-1, SHA-384 или SHA-512 под систему, которая этого требует. Все четыре работают нативно в вашем браузере через Web Crypto API.

  2. 2

    Введите секретный ключ и задайте его кодировку

    Введите или вставьте секретный ключ, затем задайте кодировку ключа в соответствии с тем, как его интерпретирует сервер: Text (UTF-8) для обычной строки, Hex для шестнадцатеричного блока или Base64 для секрета в base64. Ошибка здесь — главная причина несовпадений HMAC, поэтому в случае сомнений попробуйте все три.

  3. 3

    Введите сообщение

    Вставьте точные байты, которые хотите подписать — для вебхука это сырое тело запроса, байт в байт, без повторной сериализации и изменений пробелов. HMAC пересчитывается на лету по мере правки, и ничего не отправляется на сервер.

  4. 4

    Выберите формат вывода и скопируйте

    Выберите Hex (в стиле GitHub), Base64 (в стиле Stripe/AWS) или Base64URL (в стиле JWT) под то, что ожидает ваша интеграция, затем нажмите «Копировать», чтобы взять подпись.

  5. 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 (Hash-based Message Authentication Code) — это способ доказать одновременно целостность и подлинность сообщения с помощью общего секретного ключа. Вы подаёте сообщение и секретный ключ в хеш-функцию (здесь SHA-1, SHA-256, SHA-384 или SHA-512) в особой вложенной конструкции, определённой в RFC 2104, и получаете тег фиксированной длины. Любой, кто знает секрет, может пересчитать тег и подтвердить, что сообщение не было изменено и пришло от того, кто владеет ключом. Это стандартный механизм подписей вебхуков, подписанных API-запросов и токенов JWT семейства HS256.
Чем HMAC отличается от обычного хеша вроде SHA-256?
Обычный хеш, такой как SHA-256, доказывает только целостность: его может пересчитать любой, а значит, любой может подделать совпадающий хеш для изменённого сообщения. HMAC подмешивает секретный ключ, поэтому создать или проверить валидный тег могут только стороны, владеющие этим ключом — это добавляет подлинность поверх целостности. HMAC также использует вложенную двухпроходную конструкцию (внутреннее и внешнее хеширование с pad-ами, производными от ключа), что делает его невосприимчивым к атакам удлинения сообщения, которым подвержены «голые» SHA-1 и SHA-256. Короче: используйте хеш для обнаружения случайного повреждения и HMAC для обнаружения умышленной подмены атакующим, не знающим вашего ключа.
Как проверить подпись входящего вебхука?
Возьмите сырое тело запроса ровно таким, каким оно получено (не сериализуйте JSON заново — даже переупорядоченные ключи ломают подпись), выберите тот же алгоритм, что и ваш провайдер (обычно HMAC-SHA256), введите свой секрет подписи с правильной кодировкой ключа и установите формат вывода под заголовок (Hex для префикса sha256= у GitHub, Base64 для заголовков в стиле Stripe/Twilio). Затем откройте вкладку «Проверить», вставьте подпись из заголовка (например, X-Hub-Signature-256), и инструмент сообщит о совпадении или несовпадении, используя сравнение за постоянное время. Доверяйте полезной нагрузке, только если есть совпадение.
Какую кодировку ключа и вывода использует мой сервер?
Универсального ответа нет — это зависит от вашего провайдера, и именно поэтому инструмент выносит оба параметра в явный выбор. Типичные шаблоны: GitHub использует текстовый секрет в UTF-8 и вывод в нижнем регистре hex с префиксом sha256=; Stripe использует текстовый секрет и base64; AWS Signature V4 использует производные двоичные ключи и hex; многие внутренние системы выдают секреты в base64 или hex, которые нужно декодировать в сырые байты перед подписью. Если ваш HMAC не совпадает, виновата почти всегда кодировка — попробуйте один и тот же ключ как Text, Hex и Base64, чтобы найти интерпретацию, которую ожидает сервер.
Безопасен ли HMAC-SHA256?
Да. HMAC-SHA256 широко считается безопасным и рекомендуется по умолчанию для аутентификации сообщений. Его безопасность обеспечивается конструкцией HMAC плюс стойкой базовой хеш-функцией, и он остаётся надёжным, даже несмотря на существующие атаки на коллизии «голого» хеша — HMAC не полагается на стойкость к коллизиям так, как это делает цифровая подпись. Реальные риски операционные, а не алгоритмические: слабый или утёкший секретный ключ, логирование ключа или использование сравнения за непостоянное время. Используйте длинный случайный ключ и сравнивайте теги за постоянное время — и HMAC-SHA256 устоит.
Почему здесь нет HMAC-MD5 или HMAC-SHA-3?
Это сделано намеренно. Инструмент предлагает только SHA-1, SHA-256, SHA-384 и SHA-512, потому что именно эти хеш-функции поддерживает встроенный в браузер Web Crypto API, что сохраняет всё быстрым и полностью на стороне клиента, без дополнительных библиотек. HMAC-MD5 опущен, потому что MD5 устарел и начинать с него новые системы не стоит. HMAC-SHA-3 опущен, потому что Web Crypto не реализует SHA-3; добавление его потребовало бы поставки JavaScript-полифила. Для практически всех современных сценариев HMAC-SHA256 в любом случае правильный выбор.
HS256 (HMAC) против RS256 (RSA) — что выбрать для JWT?
HS256 подписывает и проверяет JWT одним общим секретом с помощью HMAC-SHA256, тогда как RS256 подписывает закрытым ключом RSA и проверяет соответствующим открытым ключом. Используйте HS256, когда одна сторона и выпускает, и валидирует токены (монолит или доверенные внутренние сервисы, которые могут безопасно делить секрет) — это проще и быстрее. Используйте RS256, когда токены должны проверять сторонние или многие сервисы, но они не должны иметь возможности их выпускать, поскольку вы можете раздать только открытый ключ. Изучить закодированную структуру обоих можно в кодировщике JWT; подпись HS256 — это в точности HMAC-SHA256 над заголовком и полезной нагрузкой.

Похожие инструменты

Все инструменты →

Генератор и проверка 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 с анализом энтропии.