Алгоритм подписи: HMAC-SHA256

HMAC (Hash-based Message Authentication Code) на основе SHA-256 представляет собой криптографический механизм, обеспечивающий целостность и подлинность сообщения при наличии общего секретного ключа. В библиотеке Iron (Node.js, экосистема hapi) данный алгоритм используется как фундаментальный элемент защиты данных при их «запечатывании» (sealing) и проверке целостности.


Математическая основа HMAC

HMAC строится поверх криптографической хеш-функции SHA-256 и использует секретный ключ K вместе с сообщением M.

Формальное определение:

(K, M) = H((K’ opad) ;|; H((K’ ipad) ;|; M))

где:

  • H — криптографическая хеш-функция (SHA-256)
  • K’ — ключ, приведённый к фиксированной длине блока
  • M — сообщение
  • opad — внешняя padding-константа
  • ipad — внутренняя padding-константа
  • — побитовое XOR
  • || — конкатенация

Подготовка ключа

Перед вычислением HMAC ключ приводится к размеру блока SHA-256 (64 байта):

  • если ключ короче блока — дополняется нулями
  • если длиннее — предварительно хешируется SHA-256

Результат — нормализованный ключ K'.


Двойное хеширование

HMAC использует два прохода хеширования:

1. Внутренний хеш

H_{inner} = H((K’ ipad) ;|; M)

На этом этапе сообщение связывается с ключом через внутренний паддинг.


2. Внешний хеш

HMAC = H((K’ opad) ;|; H_{inner})

Результат внутреннего хеша дополнительно защищается внешним слоем.


Свойства HMAC-SHA256

Ключевые свойства механизма:

  • Целостность данных — любое изменение сообщения изменяет итоговый MAC
  • Аутентификация источника — только обладатель ключа может сгенерировать корректную подпись
  • Устойчивость к коллизиям — основано на стойкости SHA-256
  • Защита от length extension attack — достигается двойным хешированием

Использование в библиотеке Iron

Iron применяет HMAC-SHA256 как часть схемы «seal/unseal» для структурированных данных.

Основные этапы:

  1. сериализация объекта
  2. шифрование (AES)
  3. генерация HMAC подписи
  4. объединение всех компонентов в итоговую строку

Формирование подписи в Iron

При создании защищённого токена выполняются следующие шаги:

1. Подготовка данных

  • входной объект сериализуется
  • добавляется метаинформация (версия, время жизни)

2. Шифрование содержимого

  • используется симметричный алгоритм (обычно AES-256-CBC)
  • получается ciphertext

3. Вычисление HMAC

= (K_{mac}, ; ciphertext ; | ; metadata)

где:

  • K_mac — ключ подписи
  • ciphertext — зашифрованные данные
  • metadata — служебные поля

Структура итогового токена Iron

Результирующая строка обычно включает:

  • зашифрованные данные
  • вектор инициализации (IV)
  • соль (salt)
  • HMAC подпись
  • параметры алгоритма

Все части кодируются в компактное строковое представление (base64 или аналогичный формат).


Проверка подписи (verification)

Процесс верификации выполняется в обратном порядке:

  1. извлечение компонентов токена
  2. повторное вычисление HMAC
  3. сравнение с полученной подписью

Ключевой момент — сравнение выполняется в константное время для защиты от timing-атак.


Пример вычисления HMAC-SHA256 в JavaScript

import crypto from "crypto";

function hmacSha256(key, data) {
  return crypto
    .createHmac("sha256", key)
    .update(data)
    .digest("hex");
}

const key = "secret-key";
const message = "important data";

const signature = hmacSha256(key, message);

Безопасные практики применения

Использование HMAC-SHA256 в Iron требует соблюдения ряда условий:

  • ключ должен иметь достаточную энтропию
  • ключи нельзя переиспользовать между различными контекстами
  • подпись всегда должна проверяться до расшифрования
  • сравнение MAC должно быть защищено от timing-утечек

Роль HMAC в архитектуре Iron

HMAC-SHA256 выполняет критическую функцию:

  • гарантирует неизменность зашифрованного payload
  • связывает данные с конкретным секретом
  • предотвращает подделку токенов
  • обеспечивает целостность всей цепочки «шифрование → сериализация → транспорт»

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