В 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 (шестнадцатеричное представление) является наиболее часто
используемым форматом в криптографических операциях. Каждый байт хеша
кодируется двумя символами от 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 используется там, где требуется компактная строковая форма,
например в 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 → base64b64tohex(b64) — base64 → hexhextorstr(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-512:
const md = new KJUR.crypto.MessageDigest({alg: "sha512"});
md.updateString("data");
const hex = md.digest();
const base64 = hextob64(hex);
Hex удобен для отладки и сравнения вручную, base64 — для передачи по сети, бинарный формат — для внутренних криптографических операций. В jsrsasign конвертация между ними выполняется без повторного хеширования, так как преобразуются только представления результата, а не сам алгоритм.
Гибкость системы позволяет использовать один и тот же вычисленный хеш в разных слоях приложения без повторных вычислений и потери согласованности данных.