HMAC представляет собой механизм аутентифицированного хэширования, построенный на основе криптографической хэш-функции и секретного ключа. В рамках SJCL (Stanford JavaScript Crypto Library) HMAC реализован как надстройка над выбранной хэш-функцией (SHA-1, SHA-256 и др.), обеспечивая целостность и подлинность данных без необходимости в отдельной криптосхеме.
Классическая конструкция HMAC задаётся выражением:
HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))
где:
Эта конструкция гарантирует устойчивость к расширению длины сообщения и атакам на основе свойств хэш-функций.
В 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.
Конструктор HMAC в SJCL имеет следующую сигнатуру:
new sjcl.misc.hmac(key, Hash)
Секретный ключ, используемый для вычисления MAC.
Особенности:
bitArrayКласс хэш-функции SJCL.
Примеры:
sjcl.hash.sha1sjcl.hash.sha256sjcl.hash.sha512Hash должен поддерживать интерфейс SJCL: update,
finalize, reset.
Одним из ключевых этапов является приведение ключа к размеру блока хэш-функции.
Если ключ длиннее размера блока:
Если короче:
Это обеспечивает корректную работу XOR-операций с ipad и opad.
При создании объекта HMAC SJCL формирует два внутренних состояния:
Алгоритм работы:
Подготовка ключа K
Вычисление:
Обработка сообщения:
Финализация:
SJCL реализует это через последовательное использование экземпляров выбранной хэш-функции.
Метод encrypt в sjcl.misc.hmac не выполняет
шифрование в классическом смысле, несмотря на название. Он возвращает
MAC:
var mac = hmac.encrypt(data);
Особенности:
bitArray, строка или массивbitArrayОбъект HMAC в SJCL может использоваться многократно, однако важно учитывать состояние внутреннего хэш-объекта.
Типичный сценарий:
hmac.encrypt(msg1);
hmac.reset();
hmac.encrypt(msg2);
Если reset не вызывается, состояние может быть
некорректным для повторного вычисления MAC.
SJCL использует специализированный формат bitArray,
который отличается от стандартных массивов байтов.
Особенности:
При работе с HMAC это критично, так как:
Передача объекта без корректного интерфейса приводит к сбоям на этапе
update или finalize.
Передача “сырых” массивов без конвертации может привести к некорректному результату MAC.
HMAC сохраняет внутреннее состояние хэш-объекта, что может исказить последующие вычисления.
Хотя SJCL выполняет нормализацию, ручное управление ключом без понимания процесса может привести к снижению предсказуемости реализации.
SJCL ориентирован на безопасную работу в браузерной среде и использует следующие принципы:
HMAC в этой модели выступает базовым строительным блоком для:
HMAC часто применяется совместно с:
sjcl.misc.pbkdf2 (для деривации ключей)sjcl.encrypt (в качестве PRF)В PBKDF2, например, HMAC выступает в роли базовой функции итеративного хэширования:
В JavaScript реализация HMAC в SJCL зависит от:
SHA-256 является наиболее сбалансированным вариантом по скорости и стойкости в данной библиотеке.