Класс KJUR.crypto.MessageDigest предназначен для
вычисления криптографических хеш-сумм в библиотеке Jsrsasign и
предоставляет единый интерфейс для работы с различными алгоритмами
хеширования, включая SHA-1, SHA-256, SHA-384, SHA-512 и другие
поддерживаемые реализацией Jsrsasign.
Основная задача класса — инкапсуляция процесса последовательного обновления состояния хеша и получения итогового значения в различных форматах (hex, байтовый массив, base64 в зависимости от вспомогательных методов библиотеки).
Алгоритм задаётся строковым идентификатором и передаётся при создании экземпляра или через методы конфигурации:
SHA1SHA224SHA256SHA384SHA512MD5 (в некоторых сборках Jsrsasign)Выбор алгоритма влияет на длину выходного значения и криптографическую стойкость результата. Например, SHA-256 всегда возвращает 32-байтовый хеш, представленный как 64 символа hex.
Создание экземпляра осуществляется через:
new KJUR.crypto.MessageDigest({alg: "SHA256"})
или упрощённо:
new KJUR.crypto.MessageDigest("SHA256")
При отсутствии параметра используется значение по умолчанию, которое зависит от версии Jsrsasign (чаще всего SHA-1 или SHA-256).
Экземпляр MessageDigest хранит промежуточное состояние
хеш-функции. Это позволяет обрабатывать данные по частям, что важно при
работе с потоками или большими объёмами информации.
Основные внутренние компоненты:
Метод update используется для последовательного
добавления данных в хеш:
md.update("Hello ");
md.update("world");
update(data, encoding)
data (string | Array | Uint8Array) — входные данные
encoding (string, опционально) — кодировка входной строки:
"utf8" (по умолчанию)"hex""base64"Каждый вызов update дополняет внутреннее состояние, не
завершая вычисление. Это ключевой механизм потокового хеширования.
Метод digest завершает вычисление хеша и возвращает
результат в бинарном виде или массиве байтов.
var result = md.digest();
digest()
Array<number>) или строка в
зависимости от конфигурации внутреннего криптомодуляПосле вызова digest объект обычно становится непригодным
для дальнейшего использования без повторной инициализации.
hexdigest — наиболее часто используемый метод,
возвращающий хеш в виде шестнадцатеричной строки.
var hash = md.hexdigest();
hexdigest()
строка hex, например:
e3b0c44298fc1c149afbf4c8996fb924...Этот формат используется в большинстве криптографических и протокольных задач.
Позволяет изменить алгоритм после создания объекта.
md.setAlg("SHA512");
setAlg(alg)
При смене алгоритма внутреннее состояние обычно сбрасывается, так как разные хеш-функции несовместимы по контексту.
Используется для сброса текущего состояния без изменения алгоритма.
md.reset();
reset()
MessageDigest поддерживает несколько форматов данных,
что важно при интеграции с различными источниками информации.
md.update("тест", "utf8");
Наиболее распространённый вариант.
md.update("deadbeef", "hex");
Используется при работе с бинарными протоколами.
md.update("Zm9vYmFy", "base64");
Применяется для совместимости с веб-форматами передачи данных.
md.update([0x61, 0x62, 0x63]);
Используется в низкоуровневых криптографических операциях.
var md = new KJUR.crypto.MessageDigest("SHA256");
md.update("Hello ");
md.update("world");
var hash = md.hexdigest();
Результат:
a591a6d40bf420404a011733cfb7b190...
Архитектура MessageDigest построена на принципе
инкрементального обновления:
updatedigest или
hexdigestЭто позволяет обрабатывать данные, не загружая их целиком в память, что критично для больших файлов и потоков.
После вызова digest состояние может быть некорректным
для повторного использования. Требуется:
md.reset();
или создание нового объекта.
Ошибка в параметре encoding приводит к неверному хешу:
md.update("abc", "hex"); // ошибка, если данные не hex
Недопустимо комбинировать несовместимые форматы без явного указания:
md.update("abc", "utf8");
md.update("616263", "hex");
Такая последовательность меняет семантику входных данных.
KJUR.crypto.MessageDigest использует низкоуровневые
реализации хеш-функций, определённые в пространстве:
KJUR.crypto.SHA256KJUR.crypto.SHA1KJUR.crypto.MD5В зависимости от выбранного алгоритма происходит динамическая подмена вычислительного ядра.
Класс используется в задачах:
| Режим | Описание |
|---|---|
| Однократный | хеширование полной строки за один вызов |
| Потоковый | последовательные вызовы update |
| Перезапуск | использование reset между операциями |
Разные алгоритмы требуют разного внутреннего состояния:
Это влияет на размер буфера и финальную стадию вычисления, но интерфейс класса остаётся единым.
Для проверки целостности часто используют двойное хеширование:
var md = new KJUR.crypto.MessageDigest("SHA256");
md.update(data);
var hash1 = md.hexdigest();
md.reset();
md.update(data);
var hash2 = md.hexdigest();
Совпадение hash1 и hash2 подтверждает
детерминированность вычисления.