HMAC: конструкция и параметры

HMAC представляет собой механизм аутентифицированного хэширования, построенный на основе криптографической хэш-функции и секретного ключа. В рамках SJCL (Stanford JavaScript Crypto Library) HMAC реализован как надстройка над выбранной хэш-функцией (SHA-1, SHA-256 и др.), обеспечивая целостность и подлинность данных без необходимости в отдельной криптосхеме.


Формальная структура HMAC

Классическая конструкция HMAC задаётся выражением:

HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))

где:

  • K — секретный ключ
  • m — сообщение
  • H — криптографическая хэш-функция
  • ipad — внутренняя константа заполнения (0x36)
  • opad — внешняя константа заполнения (0x5c)
  • || — конкатенация
  • — побитовое XOR

Эта конструкция гарантирует устойчивость к расширению длины сообщения и атакам на основе свойств хэш-функций.


Реализация HMAC в SJCL

В SJCL HMAC реализован через объект sjcl.misc.hmac, который принимает два ключевых параметра:

  • секретный ключ
  • хэш-функцию (например, sjcl.hash.sha256)

Типичная инициализация выглядит следующим образом:

var hmac = new sjcl.misc.hmac(key, sjcl.hash.sha256);

После создания объекта вычисление MAC выполняется через метод:

var mac = hmac.encrypt(message);

Результат возвращается в виде bitArray, что является стандартным типом представления данных в SJCL.


Параметры конструктора sjcl.misc.hmac

Конструктор HMAC в SJCL имеет следующую сигнатуру:

new sjcl.misc.hmac(key, Hash)

key

Секретный ключ, используемый для вычисления MAC.

Особенности:

  • может быть строкой, массивом или bitArray
  • внутри приводится к битовому представлению
  • при необходимости нормализуется до длины блока хэш-функции

Hash

Класс хэш-функции SJCL.

Примеры:

  • sjcl.hash.sha1
  • sjcl.hash.sha256
  • sjcl.hash.sha512

Hash должен поддерживать интерфейс SJCL: update, finalize, reset.


Нормализация ключа

Одним из ключевых этапов является приведение ключа к размеру блока хэш-функции.

Если ключ длиннее размера блока:

  • он сначала хэшируется выбранной функцией H

Если короче:

  • дополняется нулями до размера блока

Это обеспечивает корректную работу XOR-операций с ipad и opad.


Внутренний механизм вычисления

При создании объекта HMAC SJCL формирует два внутренних состояния:

  • inner hash state
  • outer hash state

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

  1. Подготовка ключа K

  2. Вычисление:

    • K ⊕ ipad → используется для внутреннего хэша
    • K ⊕ opad → используется для внешнего хэша
  3. Обработка сообщения:

    • внутренний хэш: H((K ⊕ ipad) || m)
  4. Финализация:

    • внешний хэш: H((K ⊕ opad) || inner_result)

SJCL реализует это через последовательное использование экземпляров выбранной хэш-функции.


Метод encrypt и его особенности

Метод encrypt в sjcl.misc.hmac не выполняет шифрование в классическом смысле, несмотря на название. Он возвращает MAC:

var mac = hmac.encrypt(data);

Особенности:

  • вход: bitArray, строка или массив
  • выход: bitArray
  • не модифицирует исходный объект HMAC
  • допускает повторное использование с новыми данными через reset внутреннего состояния

Повторное использование объекта HMAC

Объект HMAC в SJCL может использоваться многократно, однако важно учитывать состояние внутреннего хэш-объекта.

Типичный сценарий:

hmac.encrypt(msg1);
hmac.reset();
hmac.encrypt(msg2);

Если reset не вызывается, состояние может быть некорректным для повторного вычисления MAC.


Работа с bitArray

SJCL использует специализированный формат bitArray, который отличается от стандартных массивов байтов.

Особенности:

  • хранит данные в виде 32-битных слов
  • первый элемент массива содержит длину
  • оптимизирован для операций XOR и конкатенации

При работе с HMAC это критично, так как:

  • ключи и сообщения должны быть корректно преобразованы
  • любые строки автоматически кодируются в UTF-8 перед преобразованием

Типичные ошибки при использовании HMAC в SJCL

Использование неподходящей хэш-функции

Передача объекта без корректного интерфейса приводит к сбоям на этапе update или finalize.

Игнорирование формата bitArray

Передача “сырых” массивов без конвертации может привести к некорректному результату MAC.

Повторное использование без reset

HMAC сохраняет внутреннее состояние хэш-объекта, что может исказить последующие вычисления.

Неправильная длина ключа

Хотя SJCL выполняет нормализацию, ручное управление ключом без понимания процесса может привести к снижению предсказуемости реализации.


Особенности криптографической модели SJCL

SJCL ориентирован на безопасную работу в браузерной среде и использует следующие принципы:

  • отсутствие зависимости от нативных криптографических API
  • унифицированное представление данных через bitArray
  • модульная структура хэш-функций
  • детерминированное поведение HMAC независимо от окружения

HMAC в этой модели выступает базовым строительным блоком для:

  • аутентификации сообщений
  • построения PRF (pseudo-random functions)
  • использования в схемах KDF

Взаимодействие HMAC с другими компонентами SJCL

HMAC часто применяется совместно с:

  • sjcl.misc.pbkdf2 (для деривации ключей)
  • sjcl.encrypt (в качестве PRF)
  • схемами аутентифицированного шифрования

В PBKDF2, например, HMAC выступает в роли базовой функции итеративного хэширования:

  • HMAC(key, salt + counter)
  • многократное повторение для усложнения атак перебора

Производительность реализации

В JavaScript реализация HMAC в SJCL зависит от:

  • эффективности выбранной хэш-функции
  • количества аллокаций bitArray
  • глубины итераций при использовании в KDF

SHA-256 является наиболее сбалансированным вариантом по скорости и стойкости в данной библиотеке.