Методы updateString и updateHex
используются в Jsrsasign при работе с объектами хеширования и цифровых
подписей, когда необходимо поэтапно передавать данные для вычисления
криптографического значения. Они являются частью интерфейса объектов
KJUR.crypto.MessageDigest, KJUR.crypto.Mac, а
также некоторых реализаций подписи на основе ASN.1.
Обе функции решают одну задачу — добавление данных в уже созданный объект хеша или подписи, но различаются форматом входных данных.
Криптографические алгоритмы в Jsrsasign поддерживают инкрементальную обработку данных. Это важно в случаях, когда:
Вместо единовременного вызова update с полной строкой,
используется последовательное добавление фрагментов:
updateString — для строк в текстовом видеupdateHex — для данных в шестнадцатеричном форматеupdateString добавляет в текущий объект хеширования
строковые данные, интерпретируя их как UTF-8 текст.
obj.updateString(str);
str — строка JavaScript, которая будет преобразована в
байты UTF-8 перед обработкойПеред вычислением хеша строка проходит:
const md = new KJUR.crypto.MessageDigest({ alg: "sha256" });
md.updateString("Hello ");
md.updateString("world");
const hash = md.digest();
console.log(hash);
В этом случае вычисляется SHA-256 от строки
"Hello world", но данные передаются по частям.
const md = new KJUR.crypto.MessageDigest({ alg: "sha256" });
md.updateString("Привет ");
md.updateString("мир");
console.log(md.digest());
updateHex используется для добавления данных,
представленных в виде шестнадцатеричной строки.
obj.updateHex(hexString);
hexString — строка, содержащая байты в hex-формате
(0–9, a–f)Hex-строка разбивается на байты:
"48656c6c6f"
→ [0x48, 0x65, 0x6c, 0x6c, 0x6f]
Эти байты напрямую подаются в хеш-функцию без преобразования кодировки.
const md = new KJUR.crypto.MessageDigest({ alg: "sha256" });
md.updateHex("48656c6c6f"); // "Hello" в hex
md.updateHex("20776f726c64"); // " world"
console.log(md.digest());
Результат эквивалентен строковому варианту:
Hello world
updateString — текст (UTF-8)updateHex — бинарные данные (hex)Используется, когда данные:
Используется, когда данные:
Оба метода работают как часть одного буфера состояния:
digest() происходит финализацияВажно понимать: порядок вызовов влияет на результат.
Jsrsasign допускает комбинированное использование методов:
const md = new KJUR.crypto.MessageDigest({ alg: "sha256" });
md.updateString("dat a:");
md.updateHex("01020304");
md.updateString(":end");
console.log(md.digest());
Такой подход полезен при построении протоколов, где часть данных текстовая, а часть — бинарная.
md.updateHex("ZZ11");
Результат:
Hex должен содержать только символы:
0-9, a-f, A-F
md.updateString("0x48 0x65");
Это не hex-данные, а строка, поэтому результат будет хешем текста, а не байтов.
При создании подписи RSA или ECDSA часто используется инкрементальный ввод:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(privateKey);
sig.updateString(header);
sig.updateHex(payloadHex);
sig.updateString(footer);
const signature = sig.sign();
При верификации больших сообщений данные могут поступать частями:
Каждый сегмент обрабатывается через updateString или
updateHex.
Инкрементальный режим:
Hex-режим обычно быстрее на бинарных данных, так как отсутствует UTF-8 преобразование.
Методы updateString и updateHex доступны в
большинстве реализаций:
Но поведение зависит от конкретного класса Jsrsasign.