Какво е HMAC?

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

HMAC работи чрез обработка на съобщението чрез хеш функция (като SHA-256) два пъти, смесена с тайния ключ по специфичен начин. Този двойно-хеширащ подход го прави устойчив на атаки с удължаване на дължината, които засягат обикновените хеш функции.

Как работи HMAC?

Алгоритъмът HMAC следва следните стъпки:

  1. Подготовка на ключа: Ако тайният ключ е по-дълъг от размера на блока на хеша, той се хеширует първо. Ако е по-кратък, се попълва с нули.
  2. Вътрешен хеш: Ключът се XORва с вътрешна константа за попълване (ipad), след което се конкатенира със съобщението и се хеширует.
  3. Външен хеш: Ключът се XORва с външна константа за попълване (opad), след което се конкатенира с резултата от вътрешния хеш и се хеширует отново.

Формулата е: HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))

Тази конструкция гарантира, че дори ако нападателят знае хеша на съобщението, той не може да подправи валиден HMAC без да знае тайния ключ.

Защо да използвам HMAC вместо обикновено хеширане?

Функция Обикновен хеш HMAC
Интегритет на данните
Удостоверяване
Изисква тайния ключ
Защита срещу удължаване на дължина
Подходящ за API удостоверяване

Обикновените хешове (MD5, SHA-256) само проверяват, че данните не са се променили. HMAC допълнително доказва, че съобщението е дошло от някой, който знае тайния ключ, което го прави съществено за безопасни комуникации.

Разбиране на хеш алгоритмите

Алгоритъм Размер на изхода Ниво на сигурност Производителност Препоръка
SHA-1 160 бита (40 hex знака) Слабо Най-бързо Само наследени системи
SHA-256 256 бита (64 hex знака) Силно Бързо Препоръчана по подразбиране
SHA-384 384 бита (96 hex знака) Много силно Умерено Нужди с висока сигурност
SHA-512 512 бита (128 hex знака) Много силно Умерено Максимална сигурност

SHA-256 предлага най-добрия баланс между сигурност и производителност за повечето приложения. SHA-1 е включен за съвместимост с наследени системи, но трябва да се избягва за нови реализации поради известни уязвимости.

Сравнение на формати на изхода

Шестнадесетичен: Използва знаци 0-9 и a-f. Произвежда по-дълъг низ, но е по-лесен за четене и отстраняване на грешки. Често срещан в API и логване.

Base64: Използва знаци A-Z, a-z, 0-9, + и /. Произвежда по-кратък низ (приблизително 33% по-кратък от шестнадесетичния). Често срещан в JWT токени и компактна предача на данни.

Пример за същия HMAC:

  • Hex: 5d5d139563c95b5967b9bd9a8c9b8c8d8e8f9a9b9c9d9e9f0a0b0c0d0e0f1011
  • Base64: XV0TlWPJW1lnub2ajJuMjY6Pmpm9nZ6fCgsMDQ4PEQ==

Описание на инструмента

Този HMAC генератор създава криптографски кодове за удостоверяване, използвайки Web Crypto API за безопасно, клиентско изчисление. Въведете вашето съобщение и тайния ключ, за да генерирате моментално HMAC подписи с избор на хеш алгоритъм (SHA-1, SHA-256, SHA-384 или SHA-512) и формат на изхода (шестнадесетичен или base64).

Цялата обработка се извършва изцяло във вашия браузър—вашите тайни ключове и съобщения никога не се предават на никой сървър, което гарантира пълна поверителност и сигурност.

Примери

Пример 1: Подписване на API заявка

  • Съобщение: GET /api/users?timestamp=1704067200
  • Тайния ключ: my-api-secret-key-2024
  • Алгоритъм: SHA-256
  • Изход (Hex): d090e24b18ee077bdeceacab17fb15ff8cf7868147b302dbcb1b11630465e817

Функции

  • Множество хеш алгоритми: Поддръжка за SHA-1, SHA-256, SHA-384 и SHA-512 с визуални индикатори, показващи битова сила
  • Двойни формати на изхода: Генериране на резултати в шестнадесетичен или Base64 кодиране според вашите изисквания
  • Генериране в реално време: HMAC се актуализира моментално, докато пишете, без да е необходимо кликване на бутон
  • Сигурност на клиентската страна: Всички криптографски операции се извършват локално, използвайки Web Crypto API—нищо не се изпраща на сървъри
  • Защитен с парола вход: Полето на тайния ключ е маскирано по подразбиране, за да се предотврати подглеждане

Случаи на употреба

  • API удостоверяване: Подпишете API заявки с HMAC, за да докажете автентичност на заявката и предотвратите манипулиране (използвано от AWS, Stripe и много други услуги)
  • Проверка на webhook: Валидирайте, че входящите webhooks наистина произхождат от очаквания сервис (GitHub, Shopify, Twilio)
  • Интегритет на съобщението: Гарантирайте, че съобщенията, предавани между системи, не са били променени по време на предаването
  • Генериране на токени за сесия: Създавайте защитени идентификатори на сесия, които могат да бъдат проверени без справки в база данни
  • Цифрови подписи за документи: Генерирайте проверяеми подписи за договори, споразумения или чувствителни документи, споделени между страни

Най-добри практики за сигурност

  1. Дължина на ключа: Използвайте тайни ключове поне толкова дълги, колкото е изходът на хеша (32 байта за SHA-256, 64 байта за SHA-512)
  2. Случайност на ключа: Генерирайте ключове, използвайки криптографски защитени генератори на случайни числа, не пароли
  3. Съхранение на ключа: Никога не кодирайте ключове в изходния код; използвайте променливи на окръжението или системи за управление на защитени ключове
  4. Избор на алгоритъм: Използвайте SHA-256 или по-силен; избягвайте SHA-1 за нови реализации
  5. Сравнение с постоянно време: При програмно проверяване на HMAC, използвайте функции за сравнение с постоянно време, за да предотвратите атаки по време

Често срещани HMAC реализации

JavaScript (Node.js):

const crypto = require("crypto");
const hmac = crypto
  .createHmac("sha256", secretKey)
  .update(message)
  .digest("hex");

Python:

import hmac
import hashlib
signature = hmac.new(secret_key.encode(), message.encode(), hashlib.sha256).hexdigest()

PHP:

$signature = hash_hmac('sha256', $message, $secretKey);

Свързани стандарти и спецификации

  • RFC 2104: HMAC: Keyed-Hashing for Message Authentication
  • FIPS 198-1: The Keyed-Hash Message Authentication Code (HMAC)
  • RFC 4868: Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with IPsec