Получение хеша в hex, base64 и других форматах

В jsrsasign вычисление хеш-значений выполняется через модуль KJUR.crypto.MessageDigest, который поддерживает распространённые алгоритмы вроде SHA-1, SHA-256, SHA-384 и SHA-512. Полученный результат может быть представлен в нескольких форматах: шестнадцатеричном (hex), base64 и бинарном виде, что особенно важно при интеграции с различными протоколами и API.

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

const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("Hello world");
const hashHex = md.digest();

По умолчанию метод digest() возвращает результат в формате hex, что делает его удобным для логирования, сравнения и хранения в текстовых базах данных.


Hex-формат как основной способ представления

Hex (шестнадцатеричное представление) является наиболее часто используемым форматом в криптографических операциях. Каждый байт хеша кодируется двумя символами от 0 до f.

Пример SHA-256 в hex:

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

console.log(hex);

Особенность jsrsasign заключается в том, что hex-вывод является стандартным поведением, поэтому дополнительной конвертации не требуется.


Получение base64 представления

Base64 используется там, где требуется компактная строковая форма, например в JSON API, токенах или HTTP-заголовках. В jsrsasign преобразование результата выполняется через hextob64, так как внутренний результат хеша изначально представлен в hex.

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

const base64 = hextob64(hex);

console.log(base64);

Base64-формат уменьшает длину строки по сравнению с hex примерно на 33%, что делает его предпочтительным для сетевых протоколов.


Преобразование в бинарный формат

Некоторые криптографические сценарии требуют работы с «сырыми» байтами. В jsrsasign hex можно преобразовать в бинарный массив.

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

const bytes = hextorstr(hex);

Функция hextorstr возвращает строку, где каждый символ соответствует байту, что позволяет использовать результат в низкоуровневых операциях или совместно с бинарными протоколами.


Обратные преобразования и совместимость форматов

Jsrsasign предоставляет набор утилит для конвертации между форматами, что позволяет гибко управлять представлением хеша:

  • hextob64(hex) — hex → base64
  • b64tohex(b64) — base64 → hex
  • hextorstr(hex) — hex → бинарная строка
  • rstrtohex(str) — строка → hex

Пример цепочки преобразований:

const md = new KJUR.crypto.MessageDigest({alg: "sha1"});
md.updateString("example");
const hex = md.digest();

const base64 = hextob64(hex);
const backToHex = b64tohex(base64);

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


Работа с потоковыми данными и частичными обновлениями

При обработке больших данных хеш может формироваться по частям. Метод updateString можно вызывать многократно до финализации:

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

md.updateString("part1");
md.updateString("part2");
md.updateString("part3");

const hex = md.digest();

Результат будет идентичен хешированию полной строки, но позволяет работать с потоками или большими файлами.


Контроль кодировки входных данных

В jsrsasign входные данные интерпретируются как UTF-8 строки. Это важно при работе с не-ASCII символами, так как различия в кодировке напрямую влияют на итоговый хеш.

const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("тест");
const hex = md.digest();

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


Сравнение представлений хеша в различных алгоритмах

Разные алгоритмы не влияют на формат вывода, но влияют на длину результата:

  • SHA-1 → 40 символов hex
  • SHA-256 → 64 символа hex
  • SHA-512 → 128 символов hex

Пример генерации SHA-512:

const md = new KJUR.crypto.MessageDigest({alg: "sha512"});
md.updateString("data");
const hex = md.digest();
const base64 = hextob64(hex);

Практическое значение выбора формата

Hex удобен для отладки и сравнения вручную, base64 — для передачи по сети, бинарный формат — для внутренних криптографических операций. В jsrsasign конвертация между ними выполняется без повторного хеширования, так как преобразуются только представления результата, а не сам алгоритм.

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