KJUR.crypto.MessageDigest: методы и параметры

Класс KJUR.crypto.MessageDigest предназначен для вычисления криптографических хеш-сумм в библиотеке Jsrsasign и предоставляет единый интерфейс для работы с различными алгоритмами хеширования, включая SHA-1, SHA-256, SHA-384, SHA-512 и другие поддерживаемые реализацией Jsrsasign.

Основная задача класса — инкапсуляция процесса последовательного обновления состояния хеша и получения итогового значения в различных форматах (hex, байтовый массив, base64 в зависимости от вспомогательных методов библиотеки).


Алгоритм задаётся строковым идентификатором и передаётся при создании экземпляра или через методы конфигурации:

  • SHA1
  • SHA224
  • SHA256
  • SHA384
  • SHA512
  • MD5 (в некоторых сборках Jsrsasign)

Выбор алгоритма влияет на длину выходного значения и криптографическую стойкость результата. Например, SHA-256 всегда возвращает 32-байтовый хеш, представленный как 64 символа hex.


Конструктор и параметры инициализации

Создание экземпляра осуществляется через:

new KJUR.crypto.MessageDigest({alg: "SHA256"})

или упрощённо:

new KJUR.crypto.MessageDigest("SHA256")

Параметры конструктора

  • alg (string) — имя алгоритма хеширования Определяет внутренний механизм вычисления дайджеста.

При отсутствии параметра используется значение по умолчанию, которое зависит от версии Jsrsasign (чаще всего SHA-1 или SHA-256).


Внутреннее состояние объекта

Экземпляр MessageDigest хранит промежуточное состояние хеш-функции. Это позволяет обрабатывать данные по частям, что важно при работе с потоками или большими объёмами информации.

Основные внутренние компоненты:

  • буфер входных данных
  • текущий контекст алгоритма
  • выбранный хеш-алгоритм

Метод update

Метод update используется для последовательного добавления данных в хеш:

md.update("Hello ");
md.update("world");

Сигнатура

update(data, encoding)

Параметры

  • data (string | Array | Uint8Array) — входные данные

  • encoding (string, опционально) — кодировка входной строки:

    • "utf8" (по умолчанию)
    • "hex"
    • "base64"

Поведение

Каждый вызов update дополняет внутреннее состояние, не завершая вычисление. Это ключевой механизм потокового хеширования.


Метод digest

Метод digest завершает вычисление хеша и возвращает результат в бинарном виде или массиве байтов.

var result = md.digest();

Сигнатура

digest()

Возвращаемое значение

  • массив байтов (Array<number>) или строка в зависимости от конфигурации внутреннего криптомодуля

После вызова digest объект обычно становится непригодным для дальнейшего использования без повторной инициализации.


Метод hexdigest

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

var hash = md.hexdigest();

Сигнатура

hexdigest()

Возвращаемое значение

  • строка hex, например:

    e3b0c44298fc1c149afbf4c8996fb924...

Этот формат используется в большинстве криптографических и протокольных задач.


Метод setAlg

Позволяет изменить алгоритм после создания объекта.

md.setAlg("SHA512");

Сигнатура

setAlg(alg)

Параметры

  • alg (string) — новый алгоритм хеширования

Особенности

При смене алгоритма внутреннее состояние обычно сбрасывается, так как разные хеш-функции несовместимы по контексту.


Метод reset

Используется для сброса текущего состояния без изменения алгоритма.

md.reset();

Сигнатура

reset()

Поведение

  • очищает буфер входных данных
  • сбрасывает промежуточное состояние хеша
  • сохраняет выбранный алгоритм

Форматы входных данных

MessageDigest поддерживает несколько форматов данных, что важно при интеграции с различными источниками информации.

Строка UTF-8

md.update("тест", "utf8");

Наиболее распространённый вариант.

HEX-строка

md.update("deadbeef", "hex");

Используется при работе с бинарными протоколами.

Base64

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 построена на принципе инкрементального обновления:

  1. Инициализация алгоритма
  2. Последовательные вызовы update
  3. Финализация через digest или hexdigest

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


Особенности реализации Jsrsasign

  • Используется чистая JavaScript-реализация криптографических функций
  • Нет зависимости от WebCrypto API
  • Поведение идентично в браузере и Node.js
  • Поддерживается детерминированный результат при одинаковых входных данных

Типичные проблемы использования

Повторное использование экземпляра

После вызова digest состояние может быть некорректным для повторного использования. Требуется:

md.reset();

или создание нового объекта.


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

Ошибка в параметре encoding приводит к неверному хешу:

md.update("abc", "hex"); // ошибка, если данные не hex

Смешивание форматов

Недопустимо комбинировать несовместимые форматы без явного указания:

md.update("abc", "utf8");
md.update("616263", "hex");

Такая последовательность меняет семантику входных данных.


Внутренние зависимости

KJUR.crypto.MessageDigest использует низкоуровневые реализации хеш-функций, определённые в пространстве:

  • KJUR.crypto.SHA256
  • KJUR.crypto.SHA1
  • KJUR.crypto.MD5

В зависимости от выбранного алгоритма происходит динамическая подмена вычислительного ядра.


Практическое значение в криптографии

Класс используется в задачах:

  • вычисление контрольных сумм
  • подпись сообщений (в связке с RSA/ECDSA)
  • проверка целостности данных
  • формирование идентификаторов объектов
  • построение цепочек доверия

Сравнение режимов работы

Режим Описание
Однократный хеширование полной строки за один вызов
Потоковый последовательные вызовы update
Перезапуск использование reset между операциями

Поведение при разных алгоритмах

Разные алгоритмы требуют разного внутреннего состояния:

  • SHA-1 — 160 бит результата
  • SHA-256 — 256 бит результата
  • SHA-512 — 512 бит результата

Это влияет на размер буфера и финальную стадию вычисления, но интерфейс класса остаётся единым.


Контроль корректности результата

Для проверки целостности часто используют двойное хеширование:

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 подтверждает детерминированность вычисления.