Библиотека Jsrsasign предоставляет набор криптографических
примитивов, включая функции хеширования, реализованные через модуль
KJUR.crypto.MessageDigest. Хеш-функции применяются для
получения фиксированного дайджеста данных произвольной длины и широко
используются в задачах проверки целостности, цифровых подписей и
криптографических протоколов.
Поддерживаются алгоритмы семейства SHA (SHA-1, SHA-224, SHA-256, SHA-384, SHA-512), а также MD5. Основное внимание в современных сценариях уделяется SHA-256 и выше, как более устойчивым к криптоанализу.
Класс KJUR.crypto.MessageDigest реализует универсальный
интерфейс для вычисления хеша:
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("data");
const hash = md.digest();
Метод digest() возвращает результат в виде
шестнадцатеричной строки. Внутренне данные проходят через UTF-8
кодирование при использовании строкового ввода.
При работе со строками применяется метод updateString,
который интерпретирует вход как текстовые данные.
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("cryptographic message");
const result = md.digest();
Формируемый хеш всегда зависит от точного байтового представления строки, включая кодировку UTF-8.
Jsrsasign предоставляет вспомогательные методы в
KJUR.crypto.Util:
const hash = KJUR.crypto.Util.sha256("cryptographic message");
Такие функции используются для однократного вычисления без необходимости ручного управления состоянием объекта.
Хеширование бинарных данных требует корректной передачи массива
байтов. В браузерных окружениях это обычно ArrayBuffer или
Uint8Array.
const data = new Uint8Array([0x01, 0x02, 0x03]);
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateHex(BAuto.toHex(data));
const hash = md.digest();
Для бинарных потоков часто применяется преобразование в hex-строку, поскольку Jsrsasign оперирует строковыми представлениями байтов.
function arrayBufferToHex(buffer) {
const bytes = new Uint8Array(buffer);
return Array.from(bytes)
.map(b => ("0" + b.toString(16)).slice(-2))
.join("");
}
MessageDigest поддерживает поэтапную подачу данных. Это важно при обработке больших объёмов информации или потоков.
const md = new KJUR.crypto.MessageDigest({alg: "sha512"});
md.updateString("part1 ");
md.updateString("part2 ");
md.updateString("part3");
const digest = md.digest();
Каждый вызов updateString или updateHex
изменяет внутреннее состояние алгоритма без финализации.
Результат хеширования может быть представлен в нескольких форматах:
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("data");
const hex = md.digest();
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("data");
const base64 = md.digest("b64");
Поддержка формата передаётся параметром метода
digest.
const hash = KJUR.crypto.Util.sha1("message");
SHA-1 применяется преимущественно в устаревших системах и протоколах совместимости.
const md = new KJUR.crypto.MessageDigest({alg: "sha512"});
md.updateString("message");
const hash = md.digest();
SHA-512 обеспечивает увеличенный размер выхода и повышенную криптостойкость по сравнению с SHA-256.
HMAC используется для аутентификации сообщений с использованием
секретного ключа. В Jsrsasign он реализуется через
KJUR.crypto.Mac.
const mac = new KJUR.crypto.Mac({alg: "HmacSHA256", pass: "secretKey"});
mac.updateString("message");
const result = mac.doFinal();
Ключ участвует в процессе хеширования, обеспечивая защиту от подмены данных.
При работе с большими файлами или потоками данных хеширование выполняется по частям. Это позволяет избежать загрузки всего содержимого в память.
Типичная схема:
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateHex(chunk1);
md.updateHex(chunk2);
md.updateHex(chunk3);
const finalHash = md.digest();
Корректность хеша зависит от кодировки входных данных. Строки в Jsrsasign интерпретируются как UTF-8 последовательности байтов.
Различия в кодировке приводят к различным результатам даже при одинаковом текстовом содержимом:
SHA-256:
SHA-512:
SHA-1:
MD5:
Хеширование в Jsrsasign используется в следующих контекстах:
Jsrsasign реализует криптографические функции на JavaScript без нативных зависимостей. Это обеспечивает:
При этом производительность ниже, чем у нативных реализаций, что особенно заметно при обработке больших потоков данных.