KJUR.crypto.MessageDigest — компонент библиотеки Jsrsasign, предназначенный для вычисления криптографических хешей (дайджестов сообщений). Он реализует унифицированный интерфейс для работы с различными алгоритмами хеширования, такими как SHA-1, SHA-256, SHA-384, SHA-512, MD5 и другими, поддерживаемыми библиотекой.
Основная задача класса заключается в преобразовании произвольных входных данных в фиксированную строку хеша, которая используется в криптографии для:
KJUR.crypto.MessageDigest является обёрткой над низкоуровневыми реализациями алгоритмов хеширования, предоставляя единый интерфейс для всех поддерживаемых функций.
Процесс вычисления хеша включает три ключевых этапа:
Внутренне библиотека использует потоковую модель обработки данных, что позволяет работать с большими объёмами информации без необходимости загружать всё содержимое в память.
Объект создаётся через указание алгоритма хеширования:
var md = new KJUR.crypto.MessageDigest({alg: "sha256"});
Параметр alg определяет используемый алгоритм.
Поддерживаемые значения включают:
sha1sha224sha256sha384sha512md5Метод добавляет данные для вычисления хеша. Может вызываться многократно.
md.update("Hello ");
md.update("world");
Данные автоматически конвертируются во внутренний формат обработки.
Завершает вычисление и возвращает результат.
var hash = md.digest();
Результат обычно представлен в шестнадцатеричном формате (hex string).
Альтернативный метод, явно возвращающий хеш в виде hex-строки:
var hash = md.digestHex();
Сбрасывает внутреннее состояние объекта, позволяя повторно использовать экземпляр:
md.reset();
После вызова объект возвращается в начальное состояние, и вычисление можно начать заново.
var md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.update("cryptographic ");
md.update("hash");
var result = md.digestHex();
В результате result содержит SHA-256 хеш строки
"cryptographic hash".
MessageDigest поддерживает обработку строк и бинарных данных. При передаче строк используется UTF-8 кодировка, что важно учитывать при работе с многоязычными данными.
Пример обработки Unicode:
var md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.update("данные на русском языке");
var hash = md.digestHex();
Потоковая обработка позволяет эффективно работать с большими файлами или данными, поступающими по частям.
var md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.update(part1);
md.update(part2);
md.update(part3);
var finalHash = md.digestHex();
Такой подход предотвращает необходимость хранения всего содержимого в памяти одновременно.
Jsrsasign автоматически преобразует входные данные в бинарный формат перед обработкой. Это включает:
Это обеспечивает единообразие вычислений независимо от типа входных данных.
В Jsrsasign существует несколько способов вычисления хешей:
KJUR.crypto.MessageDigest — объектно-ориентированный
потоковый интерфейс;KJUR.crypto.Util.hashString — одноразовое
вычисление;KJUR.crypto.Util.sha256 и аналогичные функции — прямые
вызовы алгоритмов.MessageDigest выделяется гибкостью при работе с частичными данными.
При некорректном указании алгоритма возникает ошибка инициализации:
var md = new KJUR.crypto.MessageDigest({alg: "unknown"});
Также важно учитывать:
digest() без reset() может
привести к некорректному состоянию;digest() не очищаются автоматически;update() приведёт к хешированию
пустой строки.Результат может быть получен в нескольких форматах в зависимости от используемого метода:
На практике чаще всего используется hex-представление как наиболее совместимое.
MessageDigest оптимизирован для последовательной обработки данных. При работе с большими объёмами информации важно:
update;Алгоритмы SHA-2 внутри Jsrsasign реализованы с учётом эффективности на чистом JavaScript без нативных расширений.
Класс работает в различных JavaScript-средах:
Отсутствие зависимостей от WebCrypto API делает MessageDigest независимым от платформенных ограничений, однако снижает производительность по сравнению с нативными реализациями.
Типичные области применения включают:
При повторном использовании одного экземпляра важно учитывать состояние внутреннего буфера:
md.update("first");
md.digestHex();
md.reset();
md.update("second");
md.digestHex();
Без reset() второй результат будет некорректным, так как
данные накопятся поверх предыдущих.