В криптографических операциях JavaScript-библиотеки Jsrsasign данные редко существуют в одном универсальном виде. Одна и та же сущность — ключ, сертификат, подпись — может быть представлена в нескольких форматах, каждый из которых решает свою задачу: хранение, передача, совместимость с OpenSSL, работа в браузере или на сервере.
На практике используются три базовых уровня представления:
Понимание перекодирования между ними является ключом к работе с библиотекой.
DER (Distinguished Encoding Rules) представляет собой строгую бинарную сериализацию ASN.1-структур. Именно в этом виде хранятся X.509 сертификаты, приватные ключи и подписи внутри большинства криптографических систем.
В Jsrsasign DER почти никогда не используется напрямую как объект JavaScript. Вместо этого он представлен как:
Типичный пример DER в HEX-форме:
308203223082020aa003020102020900...
Работа с DER требует понимания, что это не текст, а строго структурированный бинарный поток, где каждый байт имеет смысл.
HEX (шестнадцатеричная строка) является основным рабочим форматом в Jsrsasign.
Почти все низкоуровневые функции библиотеки оперируют именно HEX:
В Jsrsasign используется:
KJUR.crypto.Util.strtohex("test")
Результат — HEX-представление строки.
KJUR.crypto.Util.hextoutf8("74657374")
HEX является связующим звеном между человекочитаемыми форматами и бинарной криптографией.
Base64 используется для безопасной передачи бинарных данных через текстовые каналы: JSON, HTTP, email.
В Jsrsasign Base64 почти всегда связан с PEM-форматами.
KJUR.crypto.Util.hextob64("74657374")
KJUR.crypto.Util.b64tohex("dGVzdA==")
Base64 не содержит структурной информации — он лишь упаковывает байты в ASCII.
PEM (Privacy Enhanced Mail) — это текстовый формат, который содержит Base64-данные, обрамлённые заголовками:
-----BEGIN CERTIFICATE-----
MIIC...
-----END CERTIFICATE-----
В Jsrsasign PEM является стандартным способом обмена:
var pem = "-----BEGIN CERTIFICATE-----\nMIIC...\n-----END CERTIFICATE-----";
var hex = KJUR.asn1.x509.X509.pemToHex(pem);
var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(hex, "CERTIFICATE");
PEM всегда содержит метаинформацию о типе объекта, что делает его более удобным для инфраструктурных задач.
Типичный процесс обработки сертификата в Jsrsasign включает несколько стадий:
PEM → Base64 → HEX → ASN.1 структура
Пример извлечения данных:
var x = new X509();
x.readCertPEM(pem);
Внутри происходит:
ASN.1 является фундаментом большинства криптографических структур.
Jsrsasign предоставляет:
var seq = ASN1HEX.getVbyList(hex, 0, ["2", "3"]);
Здесь происходит навигация по ASN.1 дереву без полного парсинга в объекты.
Приватные и публичные ключи в Jsrsasign чаще всего представлены в PKCS#1 или PKCS#8 формате.
var key = KEYUTIL.getKey(pem);
Внутри выполняется:
var pem = KEYUTIL.getPEM(key);
Помимо криптографических структур, Jsrsasign активно работает с обычными строками.
KJUR.crypto.Util.utf8tohex("Пример")
KJUR.crypto.Util.hextoutf8(hex)
Это используется при:
Хэш-функции возвращают бинарный результат, который необходимо преобразовывать.
KJUR.crypto.Util.sha256("data")
Результат уже является HEX-строкой.
KJUR.crypto.Util.hextob64(hashHex)
Такой подход используется при формировании JWT и цифровых подписей.
JWT (JSON Web Token) является одним из наиболее частых сценариев использования Jsrsasign.
Структура:
Base64Url(Header).Base64Url(Payload).Base64Url(Signature)
Base64Url — модификация Base64:
+ заменяется на -/ заменяется на _=Jsrsasign выполняет преобразования:
KJUR.crypto.Util.b64tohex
KJUR.crypto.Util.stob64u
При работе с JWT происходит несколько перекодировок:
JSON → UTF-8 → Base64Url → подпись → HEX
Пример:
var sHeader = JSON.stringify({alg: "RS256", typ: "JWT"});
var sPayload = JSON.stringify({sub: "123"});
Далее:
Процесс подписи в Jsrsasign включает обязательное преобразование:
Пример:
var sig = new KJUR.crypto.Signature({"alg": "SHA256withRSA"});
sig.init(privateKey);
sig.updateString(data);
var signatureHex = sig.sign();
Здесь результат — HEX, который часто дополнительно перекодируется:
KJUR.crypto.Util.hextob64(signatureHex)
Не все преобразования являются полностью обратимыми без контекста:
Поэтому при проектировании криптографических систем важно учитывать уровень абстракции, на котором происходит перекодирование.
PEM → Base64 → DER(HEX) → ASN.1 структура → поля сертификата
String → UTF-8 → HEX → Hash → HEX → Base64 → JWT
PEM → Base64 → DER → ASN.1 → Key Object → PEM/JSON
На практике наиболее частые проблемы связаны с:
Jsrsasign требует строгого соблюдения формата на каждом этапе, так как автоматической нормализации данных нет.
Основные функции, используемые для перекодирования:
KJUR.crypto.Util.hextob64KJUR.crypto.Util.b64tohexKJUR.crypto.Util.utf8tohexKJUR.crypto.Util.hextoutf8ASN1HEX (работа с ASN.1 в HEX)KEYUTIL (конвертация ключей)X509 (разбор сертификатов)Эти инструменты образуют базовый слой трансформации данных внутри библиотеки.
Любая криптографическая сущность в Jsrsasign может быть представлена как:
Переход между ними не является побочным процессом — это основа всей архитектуры библиотеки.