JSON-сериализация в контексте криптографических структур JWS (JSON Web Signature) представляет альтернативу компактному формату токена. В отличие от классического JWS Compact Serialization, где данные представлены одной строкой из трёх частей, JSON-сериализация использует структурированный объект, позволяющий работать с несколькими подписями, расширенными заголовками и более гибким описанием метаданных.
В библиотеке Jsrsasign работа с JSON-сериализацией встроена в модуль
KJUR.jws, который реализует спецификации JWS и JWT, включая
поддержку форматов General JSON Serialization и Flattened JSON
Serialization.
JSON-сериализация JWS существует в двух формах:
Используется для одного подписанта. Структура объекта:
payload — полезная нагрузка (Base64URL или JSON)protected — защищённый заголовок (Base64URL encoded
JSON)header — незашифрованный заголовок (необязателен)signature — криптографическая подписьПример структуры:
{
"protected": "eyJhbGciOiJIUzI1NiJ9",
"payload": "eyJ1c2VySWQiOjEyM30",
"signature": "abc123..."
}
Используется для множественных подписей. Отличие заключается в
наличии массива signatures.
Структура:
payload — общие данныеsignatures[] — массив объектов подписейКаждый элемент signatures содержит:
protectedheadersignatureПример:
{
"payload": "eyJ1c2VySWQiOjEyM30",
"signatures": [
{
"protected": "eyJhbGciOiJSUzI1NiJ9",
"signature": "sig1..."
},
{
"protected": "eyJhbGciOiJFUzI1NiJ9",
"signature": "sig2..."
}
]
}
Библиотека Jsrsasign предоставляет функциональность генерации и
проверки JWS через объект KJUR.jws.JWS.
Основные операции:
Хотя чаще используется компактный формат, Jsrsasign поддерживает генерацию JSON-структур через расширенные API.
Пример генерации JWS:
const header = {
alg: "HS256",
typ: "JWT"
};
const payload = {
sub: "1234567890",
name: "Alice",
admin: true
};
const key = "secret";
const jws = KJUR.jws.JWS.sign(
"HS256",
JSON.stringify(header),
JSON.stringify(payload),
key
);
В случае JSON Serialization структура формируется не строкой, а
объектом, где результат раскладывается по полям protected,
payload, signature.
JSON Serialization в JWS использует Base64URL кодирование без padding:
+ заменяется на -/ заменяется на _= удаляетсяЭто критически важно, так как любая ошибка в кодировании приводит к невозможности верификации подписи.
Jsrsasign автоматически обрабатывает Base64URL преобразование внутри
функций KJUR.jws.
Закодированный JSON, который участвует в вычислении подписи. Любое изменение приводит к инвалидности подписи.
Пример:
{
"alg": "HS256",
"typ": "JWT"
}
После кодирования:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Передаётся в открытом виде и не влияет на подпись. Используется для метаданных, которые могут изменяться без нарушения криптографической целостности.
Процесс формирования JWS JSON Serialization включает несколько шагов:
BASE64URL(protected) + "." + BASE64URL(payload)
const jwsObj = KJUR.jws.JWS.sign(
"HS256",
JSON.stringify({ alg: "HS256" }),
JSON.stringify({ message: "data" }),
"secret"
);
const parsed = KJUR.jws.JWS.parse(jwsObj);
Результат jwsObj в JSON-формате может быть преобразован
в структуру:
{
"protected": "...",
"payload": "...",
"signature": "..."
}
Для анализа структуры используется:
const result = KJUR.jws.JWS.parse(jwsString);
Возвращаемый объект содержит:
headerObjpayloadObjsigvalheaderB64UПроверка выполняется через:
const isValid = KJUR.jws.JWS.verify(jws, "secret");
В случае JSON Serialization библиотека автоматически извлекает:
и выполняет проверку согласно алгоритму alg.
Jsrsasign поддерживает работу с несколькими подписями через структуру
массива signatures.
Каждая подпись может использовать собственный алгоритм:
Пример логики:
Это используется в сценариях:
При работе с JSON Serialization важно учитывать, что JSON должен быть канонизирован перед подписью.
Ключевые требования:
Jsrsasign минимизирует проблемы каноникализации за счёт внутренней
обработки строк, однако при передаче объектов через
JSON.stringify порядок ключей может влиять на
воспроизводимость подписи в сложных системах.
Внутренне библиотека:
CryptoJS или WebCrypto (в зависимости от
окружения)Модули:
KJUR.jws.JWSKJUR.jws.IntDateKJUR.jws.JWSJS (в некоторых версиях для JSON
serialization helpers)JWT (JSON Web Token) является частным случаем JWS, где payload — JSON объект с claims.
JSON Serialization особенно полезна при:
Стандартный JWT чаще использует Compact Serialization, однако JSON формат применяется в системах, где требуется явная структура и расширяемость.
alg и ключаJSON Serialization в Jsrsasign применяется в системах:
Структурированный формат позволяет добавлять дополнительные подписи без изменения исходного payload, что невозможно в compact-формате.