Класс KJUR.crypto.Mac реализует вычисление кода
аутентификации сообщения (MAC) в библиотеке jsrsasign и служит
универсальной обёрткой над симметричными алгоритмами контроля
целостности, прежде всего HMAC и CMAC. Его задача заключается в
последовательной обработке входных данных и получении криптографической
подписи фиксированной структуры на основе секретного ключа.
Механизм MAC основан на идее использования секретного ключа и
криптографической хеш-функции или блочного шифра. В jsrsasign класс
KJUR.crypto.Mac абстрагирует различия между алгоритмами и
предоставляет единый интерфейс для вычисления кода аутентификации.
Внутри реализуется типовой поток обработки данных:
В зависимости от конфигурации поддерживаются следующие типы MAC:
На практике чаще всего используется HMAC-SHA256 как баланс между скоростью и криптографической стойкостью.
Инициализация MAC-объекта выполняется через передачу параметров в конструктор:
var mac = new KJUR.crypto.Mac({
"alg": "HmacSHA256",
"pass": "secret_key"
});
Ключевые параметры:
alg — алгоритм вычисления MACpass — секретный ключ (в виде строки или hex)prov — криптографический провайдер (опционально,
зависит от реализации)Ключ преобразуется в внутренний формат, подходящий выбранному алгоритму.
После создания экземпляр содержит следующие логические компоненты:
alg)Архитектура построена так, чтобы поддерживать потоковую обработку без необходимости загружать весь текст сообщения в память.
Перед началом обработки данных вызывается метод инициализации (обычно автоматически внутри конструктора или через внутренний reset):
Для HMAC используется стандартная схема:
Класс поддерживает поэтапное добавление данных, что важно при работе с большими потоками.
Основные методы:
mac.updateString("hello");
mac.updateHex("616263");
Принимает строку и преобразует её в байтовое представление UTF-8 перед обработкой.
Принимает данные в виде hex-строки и интерпретирует их как бинарный массив.
Каждый вызов update* не приводит к финализации
результата. Вместо этого данные добавляются во внутренний буфер и
немедленно передаются в хеш-функцию.
Это позволяет:
Завершающий этап выполняется через метод:
var result = mac.doFinal();
или альтернативные формы:
mac.getMac();
(в зависимости от версии реализации)
На этом этапе происходит:
Результат обычно возвращается в hex-формате.
var mac = new KJUR.crypto.Mac({
alg: "HmacSHA256",
pass: "my_secret"
});
mac.updateString("Message part 1");
mac.updateString("Message part 2");
var hmac = mac.doFinal();
Класс поддерживает несколько представлений входа:
mac.updateString("data");
Используется UTF-8 кодирование.
mac.updateHex("deadbeef");
Используется для бинарных сообщений.
Одной из ключевых особенностей KJUR.crypto.Mac является
унификация интерфейса для разных алгоритмов.
При смене параметра alg меняется только внутренняя
реализация:
"HmacSHA1"
"HmacSHA256"
"HmacSHA512"
"AESCMAC"
Внешний API остаётся одинаковым, что упрощает интеграцию в криптографические модули.
При использовании блочного шифра (например, AES) класс переключается в режим CMAC.
Особенности:
CMAC чаще используется в протоколах, где требуется стандарт AES-based аутентификация.
При использовании HMAC выполняется стандартная конструкция:
(K, m) = H((K opad) H((K ipad) m))
Где:
K — секретный ключm — сообщениеH — хеш-функцияipad, opad — фиксированные константыРеализация в KJUR.crypto.Mac отличается рядом инженерных
решений:
KJUR.cryptoПосле вызова doFinal объект может быть повторно
использован, если выполнен reset состояния:
mac.updateString("first");
var r1 = mac.doFinal();
mac.updateString("second");
var r2 = mac.doFinal();
При этом внутреннее состояние пересоздаётся на основе ключа и алгоритма.
Типовые ситуации:
В этих случаях выполнение прерывается с генерацией исключения JavaScript.
HMAC-реализация оптимизирована под:
Наибольшая нагрузка приходится на хеш-функцию, особенно при SHA-512.
MAC на базе KJUR.crypto.Mac применяется в:
Ключ может задаваться в различных форматах:
Внутренне ключ нормализуется в байтовый массив фиксированной длины.
Класс не является потокобезопасным в смысле конкурентного доступа. Каждый экземпляр предназначен для использования в одном контексте вычисления MAC.
KJUR.crypto.Mac часто используется совместно с:
KJUR.crypto.CipherKJUR.crypto.SignatureKEYUTIL для работы с ключамиЭто позволяет строить полные криптографические цепочки: подпись, шифрование и аутентификация данных в одном стеке.