Инструмент для разработчиков

Генератор HMAC

Подпишите сообщение секретным ключом. Ничего не передаётся.

Генератор HMAC Работает на вашем устройстве
  • Работает в вашем браузере — текст никуда не отправляется
  • Без регистрации и квот, пользуйтесь бесплатно сколько угодно

Как это работает

HMAC подтверждает сразу две вещи: сообщение не было изменено, а тот, кто его создал, знает общий секрет. Именно им подписывают вебхуки, API-запросы и ссылки для скачивания на большей части интернета.

Отличие от обычного хеша, и оно существенно

SHA-256 от сообщения может вычислить любой, поэтому голый хеш ничего не говорит о том, кто его создал: меняете сообщение, пересчитываете хеш — и никто не заметит подмены. В HMAC в вычисление добавляется секретный ключ, поэтому без ключа его пересчитать нельзя. В этом весь смысл, и поэтому подписи вебхуков используют HMAC, а не хеш.

Безопасная проверка

Проверяя HMAC на сервере, сравнивайте его функцией с постоянным временем: crypto.timingSafeEqual в Node, hash_equals в PHP. Обычный == возвращает результат, как только два байта отличаются, и затраченное время выдаёт, какая часть подписи верна, — этого достаточно, чтобы при некотором терпении подделать подпись. Это реальная атака, а не теоретическая.

Какой алгоритм

SHA-256, если не указано иное. SHA-1 включён, потому что многие старые API всё ещё требуют HMAC-SHA-1, а HMAC-SHA-1 не скомпрометирован так, как обычный SHA-1, — но выбирать его для новых задач нет причин.

Hex или Base64

Всё зависит исключительно от того, что ожидает другая сторона. Hex вдвое длиннее и легче читается; Base64 компактнее и чаще встречается в HTTP-заголовках. Одна и та же подпись показана в обоих видах.

Ваш ключ остаётся здесь

Подпись создаётся встроенным в браузер Web Crypto API. Ключ и сообщение никуда не отправляются, и только так такой инструмент можно ответственно предлагать: подписывающий сервис, который загружает ваш секрет, отдаёт то самое, что этот секрет защищает.

Частые вопросы

Генератор HMAC: вопросы и ответы

Чем HMAC отличается от хеша?

Хеш может пересчитать кто угодно. Для HMAC нужен секретный ключ, поэтому он подтверждает, кто его создал.

Какой алгоритм использовать?

SHA-256, если API не требует другого. SHA-1 оставлен для старых систем, которым он всё ещё нужен.

Что выбрать: hex или Base64?

То, что ожидает другая сторона. Для одной и той же подписи показаны оба варианта.

Почему сравнение должно выполняться за постоянное время?

Обычное сравнение завершается на первом же несовпадении, и разница во времени выдаёт, какая часть была верной, — этого достаточно, чтобы подделать подпись.

Отправляется ли мой секретный ключ куда-либо?

Нет. Всё выполняется в браузере с помощью Web Crypto API.