Генератор HMAC-SHA256
Создайте подпись HMAC-SHA256 на основе сообщения и секретного ключа. Инструмент кодирует их в UTF-8, применяет конструкцию HMAC из RFC 2104 с SHA-256 и возвращает тег длиной 256 бит в формате hex или Base64. Разработчики используют его для отладки подписей вебхуков от таких сервисов, как Stripe, GitHub и Slack, подписания запросов API и сравнения результатов со своим кодом. Ключ не возвращается и не записывается в журнал.
Часто задаваемые вопросы
Что такое HMAC-SHA256?
HMAC-SHA256 — это код аутентификации сообщения на основе SHA-256 и секретного ключа, определенный в RFC 2104. Только владелец ключа может вычислить правильный тег для сообщения. Результат занимает 32 байта, или 64 hex-символа.
Как проверить подпись вебхука?
Вставьте точное исходное тело запроса в качестве сообщения, а секрет для подписи — в качестве ключа, затем сравните результат с заголовком подписи. Многие сервисы подписывают составную строку, например временную метку Stripe, точку и тело запроса. Сформируйте сообщение в соответствии с их документацией. Даже один измененный байт приводит к другому тегу.
Есть ли известный тестовый вектор?
В тестовом примере 2 из RFC 4231 используется ключ Jefe и сообщение what do ya want for nothing? Ожидаемый результат — 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Этот инструмент возвращает именно это значение.
Как кодируются ключ и сообщение?
Оба значения кодируются как текст в UTF-8. Если секрет задан в hex или Base64, как это делают некоторые сервисы, соответствующие байты отличаются от отображаемого текста, поэтому сначала нужно декодировать ключ в собственном коде. Пробелы и переносы строк учитываются в обоих полях.
Сохраняется ли мой секретный ключ?
Нет. Ключ используется только для вычисления тега во время запроса. Он не включается в ответ, не записывается в журнал и не сохраняется.
Может ли ключ быть пустым или очень длинным?
HMAC принимает ключи любой длины, в том числе пустые. Ключи длиннее 64 байт сначала хешируются с помощью SHA-256, как указано в RFC. Для реального использования выберите случайный ключ длиной не менее 32 байт.
Что выбрать: hex или Base64?
Используйте формат, который передает другая сторона. GitHub и Stripe используют hex, а Slack добавляет к hex префикс v0=; во многих системах на основе AWS и JWT используется Base64. Оба формата кодируют одни и те же 32 байта.
Является ли HMAC-SHA256 тем же, что и SHA-256 от объединенных ключа и сообщения?
Нет. HMAC дважды хеширует сообщение с внутренним и внешним дополнением ключа, что защищает от атак с удлинением сообщения. Объединение ключа и сообщения с однократным хешированием дает другой, менее надежный результат.
Как сравнивать подписи в коде?
Используйте функцию сравнения за постоянное время, например crypto.timingSafeEqual в Node.js или hmac.compare_digest в Python. Обычное сравнение строк может раскрыть информацию о времени выполнения, связанную с ожидаемым тегом.
Каков максимальный размер сообщения?
Общий размер сообщения и ключа может составлять до 5 MiB текста. Этого достаточно для типичных полезных данных вебхуков и запросов API.