Криптографические хеш-функции преобразуют произвольный входной поток данных в фиксированную по длине строку, называемую хеш-значением. В контексте JavaScript-библиотеки Jsrsasign хеширование используется как базовый механизм для контроля целостности данных, формирования цифровых подписей, а также построения HMAC-кодов.
В Jsrsasign хеширование реализовано через пространство имён
KJUR.crypto, где сосредоточены основные алгоритмы: SHA-1,
SHA-256, SHA-512, MD5 и их вариации.
В основе работы лежит преобразование входной строки в байтовое представление с последующим применением математического алгоритма сжатия данных.
Основной интерфейс:
KJUR.crypto.MessageDigest
Типовая схема использования:
const md = new KJUR.crypto.MessageDigest({alg: "sha256", prov: "cryptojs"});
md.updateString("example data");
const hash = md.digest();
В результате возвращается строка в выбранном формате представления.
Jsrsasign поддерживает несколько стандартных алгоритмов:
Пример выбора алгоритма:
const md = new KJUR.crypto.MessageDigest({alg: "sha512"});
Хеш-функции работают с байтами, однако вход часто задаётся строкой. В Jsrsasign преобразование происходит автоматически, но важно учитывать кодировку.
md.updateString("данные");
Строка интерпретируется как UTF-8 последовательность.
md.updateHex("0a1b2c3d");
Вход рассматривается как hex-представление байтов.
md.updateString("part1");
md.updateString("part2");
Хеш вычисляется по суммарному состоянию, что важно для потоковой обработки.
Результат хеширования может быть представлен в различных форматах. Jsrsasign поддерживает несколько ключевых вариантов: шестнадцатеричный (hex), Base64 и бинарный формат.
Наиболее распространённый формат — строка в шестнадцатеричном виде.
Пример:
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("data");
const hash = md.digest();
Результат:
"3a6eb0790...ff21"
Каждый байт кодируется двумя символами hex.
Особенности:
Base64 используется для компактного хранения и передачи через текстовые каналы.
Пример:
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("data");
const hash = md.digest("b64");
Результат:
"OrrweQ...v8h"
Особенности:
Jsrsasign также может возвращать “сырой” бинарный результат.
const hash = md.digest("bin");
Особенности:
Jsrsasign выполняет несколько этапов преобразования данных:
Критическим аспектом является различие между строковым представлением JavaScript и байтовым представлением алгоритма.
Строка:
"тест"
внутри преобразуется в UTF-8 байты, что влияет на итоговый хеш.
Для одинакового текста в разных кодировках результат хеширования будет различаться, если предварительное преобразование выполнено некорректно.
Хеш-функции являются детерминированными: одинаковый вход всегда даёт одинаковый результат.
Пример:
const md1 = new KJUR.crypto.MessageDigest({alg: "sha256"});
md1.updateString("abc");
const h1 = md1.digest();
const md2 = new KJUR.crypto.MessageDigest({alg: "sha256"});
md2.updateString("abc");
const h2 = md2.digest();
h1 и h2 идентичны при корректной обработке
входа.
Jsrsasign поддерживает пошаговую обработку данных, что важно для больших потоков.
const md = new KJUR.crypto.MessageDigest({alg: "sha256"});
md.updateString("chunk1");
md.updateString("chunk2");
md.updateString("chunk3");
const hash = md.digest();
Такой подход исключает необходимость загрузки всего объёма данных в память.
Хеши часто применяются для контроля неизменности данных.
Типовой сценарий:
Совпадение означает отсутствие изменений.
Разные алгоритмы обладают различной устойчивостью:
В Jsrsasign выбор алгоритма напрямую влияет на криптостойкость результата.
Хеши используются как базовый строительный блок для:
Сравнение hex и base64 без декодирования приводит к ложному несовпадению.
Различие UTF-8 и Latin1 приводит к различным результатам хеширования.
Повторное использование экземпляра без сброса состояния искажает результат.
Jsrsasign позволяет конвертировать представления хеша.
Hex → Base64:
const b64 = hextob64(hex);
Base64 → Hex:
const hex = b64tohex(b64);
Внутренне MessageDigest использует:
Это позволяет обеспечить совместимость между браузерной и серверной средой.
Хеширование в Jsrsasign строится на принципе состояния:
update изменяет внутренний контекстdigest завершает вычислениеПосле вызова digest объект обычно считается завершённым
и не используется повторно без повторной инициализации.
Hex используется в логах и отладке.
Base64 применяется в:
Binary формат используется внутри криптографических модулей и редко выходит за пределы библиотеки.
Одной из ключевых характеристик является переносимость:
дают полностью идентичные значения на разных платформах JavaScript.