Генератор 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.