Метод updateString и updateHex

Методы updateString и updateHex используются в Jsrsasign при работе с объектами хеширования и цифровых подписей, когда необходимо поэтапно передавать данные для вычисления криптографического значения. Они являются частью интерфейса объектов KJUR.crypto.MessageDigest, KJUR.crypto.Mac, а также некоторых реализаций подписи на основе ASN.1.

Обе функции решают одну задачу — добавление данных в уже созданный объект хеша или подписи, но различаются форматом входных данных.


Криптографические алгоритмы в Jsrsasign поддерживают инкрементальную обработку данных. Это важно в случаях, когда:

  • данные поступают частями (стриминг, файлы, сетевые пакеты)
  • невозможно загрузить весь контент в память
  • требуется вычисление хеша для больших объемов данных

Вместо единовременного вызова update с полной строкой, используется последовательное добавление фрагментов:

  • updateString — для строк в текстовом виде
  • updateHex — для данных в шестнадцатеричном формате

Метод updateString

Назначение

updateString добавляет в текущий объект хеширования строковые данные, интерпретируя их как UTF-8 текст.

Сигнатура

obj.updateString(str);

Параметры

  • str — строка JavaScript, которая будет преобразована в байты UTF-8 перед обработкой

Особенности обработки

Перед вычислением хеша строка проходит:

  • преобразование в UTF-8 байтовую последовательность
  • дальнейшую обработку алгоритмом (SHA-1, SHA-256, MD5 и др.)

Пример использования SHA-256

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", но данные передаются по частям.


Важные особенности

  • Кодировка всегда UTF-8
  • одинаковая строка на разных платформах даёт одинаковый результат
  • важно учитывать нормализацию Unicode (особенно для кириллицы и эмодзи)

Пример с кириллицей

const md = new KJUR.crypto.MessageDigest({ alg: "sha256" });

md.updateString("Привет ");
md.updateString("мир");

console.log(md.digest());

Метод updateHex

Назначение

updateHex используется для добавления данных, представленных в виде шестнадцатеричной строки.

Сигнатура

obj.updateHex(hexString);

Параметры

  • hexString — строка, содержащая байты в hex-формате (0–9, a–f)

Как обрабатываются данные

Hex-строка разбивается на байты:

"48656c6c6f"
→ [0x48, 0x65, 0x6c, 0x6c, 0x6f]

Эти байты напрямую подаются в хеш-функцию без преобразования кодировки.


Пример SHA-256 с hex входом

const md = new KJUR.crypto.MessageDigest({ alg: "sha256" });

md.updateHex("48656c6c6f"); // "Hello" в hex
md.updateHex("20776f726c64"); // " world"

console.log(md.digest());

Результат эквивалентен строковому варианту:

Hello world

Ключевые различия updateString и updateHex

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

  • updateString — текст (UTF-8)
  • updateHex — бинарные данные (hex)

Когда использовать updateString

Используется, когда данные:

  • приходят из пользовательского ввода
  • являются текстом (JSON, сообщения, XML)
  • содержат Unicode символы

Когда использовать updateHex

Используется, когда данные:

  • уже представлены в бинарном виде
  • извлечены из криптографических структур
  • получены из сертификатов, ключей, ASN.1 объектов
  • являются результатом другого хеша или шифрования

Внутреннее поведение в Jsrsasign

Оба метода работают как часть одного буфера состояния:

  1. создаётся внутренний state алгоритма
  2. данные последовательно добавляются через update*
  3. после вызова digest() происходит финализация

Важно понимать: порядок вызовов влияет на результат.


Последовательное смешивание updateString и updateHex

Jsrsasign допускает комбинированное использование методов:

const md = new KJUR.crypto.MessageDigest({ alg: "sha256" });

md.updateString("dat a:");
md.updateHex("01020304");
md.updateString(":end");

console.log(md.digest());

Такой подход полезен при построении протоколов, где часть данных текстовая, а часть — бинарная.


Ошибки при использовании

Несоответствие формата hex

md.updateHex("ZZ11");

Результат:

  • ошибка парсинга или некорректный результат

Hex должен содержать только символы:

0-9, a-f, A-F

Потеря байтов из-за updateString

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 доступны в большинстве реализаций:

  • MD5
  • SHA-1
  • SHA-256 / SHA-512
  • HMAC
  • RSA/ECDSA Signature

Но поведение зависит от конкретного класса Jsrsasign.


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

  • вычисление хеша файлов по частям
  • обработка сетевых пакетов TLS-подобных структур
  • формирование цифровых подписей
  • работа с ASN.1 сертификатами
  • криптографические протоколы обмена ключами