Назад к вопросам
Middle
133
questionbank

Что такое HMAC и как он используется?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Алгоритм работы:

  1. Формирование внутреннего и внешнего ключей из секретного ключа и констант (ipad, opad).
  2. Вычисление внутреннего хеша: hash(секретный ключ XOR ipad + сообщение).
  3. Вычисление внешнего хеша: hash(секретный ключ XOR opad + внутренний хеш). Это и есть HMAC.

Использование:

  • Аутентификация API запросов: Сервер и клиент имеют общий секретный ключ. Клиент вычисляет HMAC для данных запроса и отправляет его в заголовке. Сервер вычисляет HMAC по тем же данным и ключу, сравнивая с присланным значением. Если совпадает, запрос считается аутентичным.
  • Проверка целостности данных: Если HMAC сообщения совпадает с повторно вычисленным HMAC, можно быть уверенным, что данные не были изменены во время передачи.
  • Использование в JSON Web Tokens (JWT): HMAC часто применяется как алгоритм цифровой подписи (HS256, HS384, HS512) для обеспечения целостности данных токена.

Пример реализации (псевдокод):

function hmacSHA256(key, message) {
    // padding константы
    const blockSize = 64; // для SHA-256
    const ipad = 0x36;
    const opad = 0x5c;

    // Подготовка ключа
    let paddedKey = key;
    if (key.length > blockSize) {
        paddedKey = sha256(key);
    }
    while (paddedKey.length < blockSize) {
        paddedKey += 0x00;
    }

    // Внутренний хеш
    const innerPaddedKey = xor(paddedKey, ipad);
    const innerHash = sha256(innerPaddedKey + message);

    // Внешний хеш (HMAC)
    const outerPaddedKey = xor(paddedKey, opad);
    const hmac = sha256(outerPaddedKey + innerHash);

    return hmac;
}

// В реальных библиотеках реализация оптимизирована и отличается

Ключевое отличие от простого хеширования с добавлением ключа (hash(ключ + сообщение) или hash(сообщение + ключ)) в том, что HMAC устойчив к атакам удлинения сообщений, так как используется две фазы хеширования с разными константами padding.