HMAC Generator

Генерирует HMAC-подписи с SHA-256, SHA-384 или SHA-512

Алгоритм

Сообщение

Работает локально · Безопасно вставлять секреты

Секретный ключ

Работает локально · Безопасно вставлять секреты

HMAC-подпись

HMAC-подпись будет отображена здесь…

Что такое HMAC?

HMAC (Hash-based Message Authentication Code) — криптографическая конструкция, определённая в RFC 2104, которая объединяет хеш-функцию с секретным ключом для получения аутентификационного тега фиксированного размера. В отличие от обычного хеша, который может вычислить любой, HMAC может быть сгенерирован и проверен только теми, кто знает секретный ключ. HMAC является стандартным механизмом проверки как целостности, так и подлинности сообщения — подтверждая, что данные не были изменены и что они получены от доверенного отправителя.

Алгоритм HMAC работает с любой итерационной хеш-функцией: SHA-256, SHA-384, SHA-512 и даже устаревшими функциями, такими как SHA-1 или MD5. Результирующая конструкция называется по имени используемой хеш-функции — HMAC-SHA256, HMAC-SHA384 или HMAC-SHA512. Поскольку доказательство безопасности HMAC опирается на устойчивость хеш-функции к коллизиям и определённые псевдослучайные свойства, для новых систем рекомендуются алгоритмы семейства SHA-2. HMAC-SHA256 — наиболее широко применяемый вариант: он используется в AWS Signature V4, вебхуках Stripe, секретах вебхуков GitHub, подписании запросов Slack и JSON Web Tokens (HS256).

Конструкция HMAC обладает важным свойством, отсутствующим у обычного хеширования: устойчивостью к атакам на расширение длины. При использовании только SHA-256 злоумышленник, знающий H(message), может вычислить H(message || attacker_data), не зная исходного сообщения. Структура двойного хеширования HMAC (внутренний и внешний хеш с разными дополненными ключами) полностью исключает эту атаку. Именно поэтому схемы подписи API используют HMAC, а не конкатенацию секретного ключа с сообщением перед хешированием.

Зачем нужен онлайн-генератор HMAC?

Вычисление HMAC-подписей обычно требует написания кода или использования CLI-инструментов. Этот браузерный генератор HMAC позволяет мгновенно создавать подписи HMAC-SHA256, HMAC-SHA384 и HMAC-SHA512 без установки программ или переключения в терминал.

Мгновенное вычисление HMAC
Введите сообщение и секретный ключ, выберите алгоритм хеширования — и сразу получите HMAC-подпись. Web Crypto API выполняет вычисление нативно в вашем браузере.
🔒
Обработка данных без передачи на сервер
Ваше сообщение и секретный ключ никогда не покидают устройство. Все вычисления HMAC выполняются локально через Web Crypto API — без серверных запросов, логирования и хранения данных.
📋
Поддержка нескольких алгоритмов
Переключайтесь между HMAC-SHA256, HMAC-SHA384 и HMAC-SHA512 в один клик. Сравнивайте результаты разных алгоритмов для проверки соответствия реализации на бэкенде.
🔍
Без учётной записи и установки
Работает в любом современном браузере — Chrome, Firefox, Safari, Edge. Без регистрации, расширений и настройки CLI. Откройте страницу и сразу приступайте к генерации HMAC-подписей.

Сценарии использования генератора HMAC

Frontend-разработчик — проверка подписей вебхуков
Stripe, GitHub и Shopify подписывают тела вебхуков с помощью HMAC-SHA256. Используйте этот инструмент для вычисления ожидаемой подписи из тела запроса и секрета, а затем сравните её с подписью из HTTP-заголовка в процессе разработки.
Backend-инженер — подписание API-запросов
AWS Signature V4 требует HMAC-SHA256 на нескольких этапах процесса подписания. Генерируйте эталонные значения HMAC в процессе разработки для отладки несоответствий при подписании и проверки промежуточных шагов вычисления.
DevOps — валидация при ротации секретов
При ротации секретов вебхуков или ключей подписи API вычисляйте HMAC-подписи как со старым, так и с новым ключом, чтобы убедиться, что приложение корректно обрабатывает переход до истечения срока действия старого ключа.
QA-инженер — тестовые векторы для подписей
Генерируйте тестовые векторы HMAC с известными входными данными и ключами для построения регрессионных тестов промежуточного слоя аутентификации. Проверяйте корректность обработки пустых сообщений, Unicode-ввода и длинных ключей.
Инженер по данным — аутентификация сообщений в пайплайнах
Добавляйте HMAC-подписи к сообщениям в событийно-ориентированных пайплайнах (Kafka, SQS), чтобы убедиться, что сообщения не были изменены при передаче между сервисами.
Студент — изучение криптографии
Экспериментируйте с HMAC, чтобы понять, как изменение одного символа в сообщении или ключе приводит к полностью другой подписи. Сравнивайте вывод HMAC с обычным выводом SHA-256, чтобы наблюдать разницу, которую вносит секретный ключ.

HMAC vs обычный хеш vs шифрование

HMAC, обычное хеширование и шифрование служат разным целям. HMAC обеспечивает аутентификацию сообщений — доказательство того, что оно создано обладателем секретного ключа и не было изменено. Обычный хеш даёт только целостность, но не аутентификацию. Шифрование обеспечивает конфиденциальность. В таблице ниже поясняются различия.

СвойствоHMACPlain HashEncryption
PurposeMessage authentication + integrityData integrity only (no key)Confidentiality + integrity
Requires secret keyYesNoYes
Verifiable byParties who share the secretAnyoneRecipient with key
ReversibleNo — digest onlyNo — digest onlyYes — decryption recovers data
Output sizeDepends on hash (e.g. 256 bits)Depends on hashVariable (ciphertext)
StandardRFC 2104FIPS 180-4NIST SP 800-38A (AES)
Use case exampleWebhook signature verificationFile checksum verificationEncrypting data at rest

Сравнение алгоритмов HMAC

HMAC может использовать любую хеш-функцию, но выбор базового алгоритма определяет размер вывода, уровень безопасности и совместимость с браузером. HMAC-SHA256 — наиболее распространённый выбор для новых систем. В таблице ниже сравниваются варианты, с которыми вы, вероятнее всего, столкнётесь.

АлгоритмРазмер дайджестаДлина в hexWeb Crypto APIОптимален для
HMAC-SHA256256 bits64 hex charsYesAPI signing, webhooks, JWT (HS256)
HMAC-SHA384384 bits96 hex charsYesTLS 1.3 PRF, CNSA compliance
HMAC-SHA512512 bits128 hex charsYesHigh-security signatures, HKDF
HMAC-SHA1160 bits40 hex charsYesLegacy OAuth 1.0, TOTP (RFC 6238)
HMAC-MD5128 bits32 hex charsNoLegacy only — not recommended

Как HMAC работает изнутри

HMAC дважды применяет базовую хеш-функцию с двумя разными производными ключами-паддингами. Конструкция определена в RFC 2104 и доказана как PRF (псевдослучайная функция) при стандартных криптографических допущениях. Ключ сначала дополняется или хешируется до размера блока хеш-функции (64 байта для SHA-256, 128 байт для SHA-512).

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
where K' = key padded to block size, ipad = 0x36, opad = 0x5C

Алгоритм применяет XOR дополненного ключа с константой внутреннего паддинга (ipad, 0x36 повторённый), конкатенирует результат с сообщением и хеширует. Затем применяет XOR дополненного ключа с константой внешнего паддинга (opad, 0x5C повторённый), конкатенирует с результатом внутреннего хеша и снова хеширует. Структура двойного хеширования предотвращает атаки на расширение длины и гарантирует, что вывод HMAC невозможно вычислить без знания секретного ключа.

Примеры кода для HMAC

HMAC поддерживается нативно во всех основных языках и средах выполнения. Web Crypto API предоставляет HMAC-SHA256, HMAC-SHA384 и HMAC-SHA512 в браузерах без каких-либо библиотек. Приведённые ниже примеры демонстрируют реальные паттерны использования, включая проверку подписей вебхуков и сравнение в постоянное время.

JavaScript (Web Crypto API)
async function hmacSHA256(message, secret) {
  const enc = new TextEncoder()
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' },
    false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
  return Array.from(new Uint8Array(sig))
    .map(b => b.toString(16).padStart(2, '0')).join('')
}

await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
  .update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
Python
import hmac
import hashlib

# HMAC-SHA256
sig = hmac.new(
    b'my-secret-key',
    b'hello world',
    hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
    print("Signature valid")

# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()
Go
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "fmt"
)

func main() {
    mac := hmac.New(sha256.New, []byte("my-secret-key"))
    mac.Write([]byte("hello world"))
    sig := mac.Sum(nil)
    fmt.Printf("%x\n", sig)
    // → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

    // Verify: use hmac.Equal for constant-time comparison
    expected := mac.Sum(nil)
    fmt.Println(hmac.Equal(sig, expected)) // true
}
CLI (OpenSSL)
# HMAC-SHA256
echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key"
# → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

# HMAC-SHA512
echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key"

# Verify a file signature
openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz

# HMAC with hex key (e.g. from a webhook secret)
echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"

Часто задаваемые вопросы

В чём разница между HMAC и обычным хешем?
Обычный хеш (SHA-256, MD5) принимает только сообщение и выдаёт дайджест, который может вычислить любой. HMAC принимает и сообщение, и секретный ключ, создавая подпись, которую может сгенерировать или проверить только тот, кто знает ключ. Это означает, что HMAC обеспечивает аутентификацию (подтверждение личности отправителя) в дополнение к проверке целостности. Обычный хеш лишь подтверждает, что данные не изменились, но не говорит, кто их создал.
HMAC-SHA256 безопасен?
Да. HMAC-SHA256 считается безопасным по состоянию на 2026 год. Его безопасность основана на псевдослучайных свойствах SHA-256 и самой конструкции HMAC (RFC 2104). Не продемонстрировано ни одной практической атаки на HMAC-SHA256. Даже HMAC-MD5 и HMAC-SHA1 остаются безопасными на практике, поскольку безопасность HMAC не требует полной устойчивости к коллизиям базовой хеш-функции — хотя для новых систем рекомендуются варианты SHA-2.
Почему вебхуки используют HMAC вместо шифрования тела запроса?
Тела вебхуков обычно содержат данные, которые получатель и так ожидает — детали заказа, уведомления о событиях, обновления статуса. Цель не в том, чтобы скрыть данные (конфиденциальность), а в том, чтобы подтвердить, что они получены от легитимного отправителя и не изменены при передаче (подлинность и целостность). HMAC решает эту задачу с минимальными накладными расходами: отправитель вычисляет HMAC тела с общим секретом и включает его в HTTP-заголовок. Получатель пересчитывает HMAC и сравнивает. Шифрование добавило бы излишнюю сложность и трудности с управлением ключами.
Как безопасно сравнивать HMAC-подписи?
Всегда используйте функцию сравнения с постоянным временем выполнения. В Python — hmac.compare_digest(), в Node.js — crypto.timingSafeEqual(), в Go — hmac.Equal(). Стандартные операторы сравнения строк (== или ===) могут раскрывать информацию через временны́е атаки: злоумышленник может измерить время сравнения, чтобы определить, сколько байт его поддельной подписи совпадают с правильной, а затем подобрать оставшиеся байты по одному.
Можно ли обратить HMAC, чтобы восстановить секретный ключ?
Нет. HMAC основан на односторонней хеш-функции, поэтому нет математического способа извлечь ключ из вывода HMAC. Злоумышленнику потребовался бы полный перебор пространства ключей, что нереально для ключей длиной 128 бит и более. Тем не менее слабые или короткие ключи (например, простые пароли) уязвимы для атак по словарю, поэтому для HMAC-SHA256 всегда используйте криптографически случайные ключи длиной не менее 256 бит.
Что происходит, если ключ HMAC длиннее размера блока хеша?
Если секретный ключ длиннее размера блока хеш-функции (64 байта для SHA-256, 128 байт для SHA-512), алгоритм HMAC сначала хеширует ключ базовой хеш-функцией, сокращая его до длины вывода хеша, и затем использует этот хеш как фактический ключ. Это означает, что очень длинные ключи не обеспечивают дополнительной безопасности сверх размера вывода хеша. Для HMAC-SHA256 ключи длиннее 64 байт хешируются до 32 байт и не дают преимуществ безопасности перед 64-байтовым ключом; ключи до 64 байт используются в полном объёме.
Когда следует использовать HMAC-SHA512 вместо HMAC-SHA256?
Используйте HMAC-SHA512, когда этого требует протокол (некоторые функции формирования ключей, например HKDF-SHA512, генерация ключей Ed25519), когда нужна более широкая подпись для дополнительной защиты, или при работе на 64-битном оборудовании, где SHA-512 фактически быстрее SHA-256. Для большинства веб-приложений, подписания API и проверки вебхуков HMAC-SHA256 обеспечивает достаточный уровень безопасности и является более распространённым выбором.