Алгоритмы RS256, RS384 и RS512 относятся к семейству RSA Signature with SHA-2. В основе лежит асимметричная криптография RSA, где используется пара ключей: приватный для подписи и публичный для проверки подписи. Различие между вариантами заключается исключительно в используемой хэш-функции:
Каждый из этих алгоритмов обеспечивает различный уровень криптографической стойкости и вычислительной нагрузки.
Библиотека Jsrsasign предоставляет полный набор инструментов для работы с RSA-подписями, включая создание и верификацию JWT, а также низкоуровневые операции с ключами и подписями.
Основные классы и функции:
KJUR.crypto.SignatureKEYUTILKJUR.jws.JWSПоддержка алгоритмов задаётся строковыми идентификаторами:
"RS256""RS384""RS512"Эти идентификаторы используются при инициализации объекта подписи.
Перед созданием подписи требуется RSA ключевая пара.
Пример генерации ключа:
const rsaKey = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = rsaKey.prvKeyObj;
const publicKey = rsaKey.pubKeyObj;
Размер ключа 2048 бит считается минимально допустимым, однако в современных системах часто используется 3072 или 4096 бит.
Алгоритм RS256 является наиболее распространённым в JWT-системах благодаря балансу скорости и безопасности.
const sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(privateKey);
sig.updateString("data_to_sign");
const signature = sig.sign();
Ключевые этапы:
Результат возвращается в формате hex или base64 в зависимости от настроек.
const sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(publicKey);
sig.updateString("data_to_sign");
const isValid = sig.verify(signature);
Проверка осуществляется с использованием публичного ключа. Любое изменение входных данных приводит к невозможности верификации.
Разница между RS384 и RS512 заключается в длине хэша, что напрямую влияет на:
const sig = new KJUR.crypto.Signature({ "alg": "SHA384withRSA" });
sig.init(privateKey);
sig.updateString("data");
const signature = sig.sign();
RS384 используется в системах, где требуется усиленная защита по сравнению с RS256, но без значительного увеличения нагрузки.
const sig = new KJUR.crypto.Signature({ "alg": "SHA512withRSA" });
sig.init(privateKey);
sig.updateString("data");
const signature = sig.sign();
RS512 обеспечивает максимальную криптостойкость в рамках RSA + SHA-2, однако требует больше вычислительных ресурсов.
Jsrsasign содержит встроенный модуль JWS для работы с JSON Web Signature.
const header = { alg: "RS256", typ: "JWT" };
const payload = { sub: "1234567890", name: "Alice", admin: true };
const jwt = KJUR.jws.JWS.sign(
"RS256",
JSON.stringify(header),
JSON.stringify(payload),
privateKey
);
const isValid = KJUR.jws.JWS.verify(jwt, publicKey, ["RS256"]);
Для RS384 и RS512 изменение алгоритма производится аналогично:
"RS384""RS512"Процесс создания подписи включает несколько этапов:
header.payloadФактически RS256/384/512 не шифрует данные, а подписывает хэш.
Jsrsasign автоматически применяет Base64Url encoding:
+ на -/ на _=Это критически важно для совместимости с JWT-стандартом RFC 7519.
Наиболее распространённые проблемы:
Подпись, созданная с RS256, не может быть проверена как RS512.
PEM-формат должен сохраняться без изменений:
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
Любое изменение данных делает подпись недействительной.
Сравнение характеристик:
На практике RS256 используется чаще всего, RS512 — в высокозащищённых системах.
Подписи Jsrsasign полностью совместимы с:
При условии одинакового алгоритма и корректного PEM-формата ключей.
Разница между ними проявляется только на уровне хэш-функции, RSA-механизм остаётся одинаковым.
Библиотека поддерживает:
Конвертация PEM → объект ключа:
const keyObj = KEYUTIL.getKey(pemString);
RSA-ключи представлены как объекты с параметрами:
Эти значения используются для математической операции возведения в степень по модулю.
SHA-2 выполняет предварительное сжатие данных перед RSA-операцией. Это предотвращает: