Модуль JWS в библиотеке jsrsasign реализует работу с JSON Web Signature — форматом цифровой подписи, стандартизированным в RFC 7515. Основная задача — формирование, подпись и проверка токенов, состоящих из трех частей:
BASE64URL(HEADER) . BASE64URL(PAYLOAD) . BASE64URL(SIGNATURE)
Внутренняя структура модуля организована вокруг пространства имен
KJUR.jws, где ключевые операции разделены на генерацию
подписи и её верификацию.
JWS состоит из следующих компонентов:
JSON-объект с метаданными подписи:
{
"alg": "HS256",
"typ": "JWT"
}
Ключевые поля:
alg — алгоритм подписи (например, HS256, RS256,
ES256)typ — тип токена (обычно JWT)kid — идентификатор ключаПроизвольный JSON:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Результат криптографической операции:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
Основные классы и методы:
Главный класс для работы с подписью.
var sHeader = JSON.stringify({alg: "HS256", typ: "JWT"});
var sPayload = JSON.stringify({user: "alice"});
var sJWS = KJUR.jws.JWS.sign(
"HS256",
sHeader,
sPayload,
"secret"
);
Параметры:
HS256, RS256, и т.д.)var isValid = KJUR.jws.JWS.verify(
sJWS,
"secret",
["HS256"]
);
Возвращает true или false.
Алгоритмы соответствуют стандартам из RFC 7518.
var keypair = KEYUTIL.generateKeypair("RSA", 2048);
var sJWS = KJUR.jws.JWS.sign(
"RS256",
sHeader,
sPayload,
keypair.prvKeyObj
);
var isValid = KJUR.jws.JWS.verify(
sJWS,
keypair.pubKeyObj,
["RS256"]
);
var keypair = KEYUTIL.generateKeypair("EC", "secp256r1");
Поддерживаемые кривые:
JWS использует Base64URL, отличающийся от стандартного Base64:
| Символ | Base64 | Base64URL |
|---|---|---|
| + | + | - |
| / | / | _ |
| = | padding | удаляется |
В jsrsasign:
var encoded = KJUR.jws.JWS.readSafeJSONString(sJWS);
var parsed = KJUR.jws.JWS.parse(sJWS);
Результат:
{
headerObj: {...},
payloadObj: {...},
sigHex: "..."
}
JWS лежит в основе JWT. Модуль позволяет работать с JWT напрямую:
var isValid = KJUR.jws.JWS.verifyJWT(
token,
key,
{
alg: ["HS256"],
iss: ["issuer"],
aud: ["audience"]
}
);
Параметры проверки:
alg — допустимые алгоритмыiss — issueraud — audienceexp — время истеченияnbf — not beforeJWS.verifyJWT автоматически проверяет:
exp — срок действияnbf — время начала действияiat — время выпускаПример payload:
{
"exp": 1716239022,
"nbf": 1616239022
}
Тип ключа зависит от алгоритма:
| Алгоритм | Тип ключа |
|---|---|
| HS256 | строка (secret) |
| RS256 | RSA ключ |
| ES256 | EC ключ |
Ключи могут быть:
var pubKey = KEYUTIL.getKey(pemString);
PEM формат:
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
Методы могут выбрасывать исключения:
Рекомендуется использовать try/catch:
try {
var isValid = KJUR.jws.JWS.verify(sJWS, key, ["RS256"]);
} catch (e) {
console.error(e);
}
noneaud, issПример уязвимости: если не ограничить алгоритмы:
verify(token, key)
возможно подменить alg на none.
Модуль использует:
KJUR.crypto.SignatureKEYUTILASN1 обработчикиПодпись формируется так:
.var header = {alg: "HS256", typ: "JWT"};
var payload = {user: "admin"};
var token = KJUR.jws.JWS.sign(
"HS256",
JSON.stringify(header),
JSON.stringify(payload),
"secret"
);
var valid = KJUR.jws.JWS.verify(token, "secret", ["HS256"]);
kidvar key = KEYUTIL.getKey({
kty: "RSA",
n: "...",
e: "AQAB"
});
JWS используется в:
Полезные методы:
KJUR.jws.JWS.parse(token)
Позволяет анализировать содержимое без проверки подписи.
HEADER -> алгоритм и метаданные
PAYLOAD -> данные
SIGNATURE -> криптографическая подпись
Модуль JWS в jsrsasign обеспечивает полный цикл работы с цифровыми подписями в формате, совместимом с современными протоколами аутентификации и авторизации.