Работа с RS256, RS384, RS512

Криптографическая основа RSA с подписью на основе SHA

Алгоритмы RS256, RS384 и RS512 относятся к семейству RSA Signature with SHA-2. В основе лежит асимметричная криптография RSA, где используется пара ключей: приватный для подписи и публичный для проверки подписи. Различие между вариантами заключается исключительно в используемой хэш-функции:

  • RS256 — SHA-256
  • RS384 — SHA-384
  • RS512 — SHA-512

Каждый из этих алгоритмов обеспечивает различный уровень криптографической стойкости и вычислительной нагрузки.

Поддержка RS256/384/512 в Jsrsasign

Библиотека Jsrsasign предоставляет полный набор инструментов для работы с RSA-подписями, включая создание и верификацию JWT, а также низкоуровневые операции с ключами и подписями.

Основные классы и функции:

  • KJUR.crypto.Signature
  • KEYUTIL
  • KJUR.jws.JWS

Поддержка алгоритмов задаётся строковыми идентификаторами:

  • "RS256"
  • "RS384"
  • "RS512"

Эти идентификаторы используются при инициализации объекта подписи.

Генерация RSA-ключей

Перед созданием подписи требуется RSA ключевая пара.

Пример генерации ключа:

const rsaKey = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = rsaKey.prvKeyObj;
const publicKey = rsaKey.pubKeyObj;

Размер ключа 2048 бит считается минимально допустимым, однако в современных системах часто используется 3072 или 4096 бит.

Создание подписи RS256

Алгоритм RS256 является наиболее распространённым в JWT-системах благодаря балансу скорости и безопасности.

const sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(privateKey);
sig.updateString("data_to_sign");
const signature = sig.sign();

Ключевые этапы:

  • инициализация объекта подписи
  • установка приватного ключа
  • передача данных
  • вычисление подписи

Результат возвращается в формате hex или base64 в зависимости от настроек.

Проверка подписи RS256

const sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(publicKey);
sig.updateString("data_to_sign");
const isValid = sig.verify(signature);

Проверка осуществляется с использованием публичного ключа. Любое изменение входных данных приводит к невозможности верификации.

RS384 и RS512: особенности использования

Разница между RS384 и RS512 заключается в длине хэша, что напрямую влияет на:

  • криптографическую стойкость
  • время вычисления подписи
  • размер внутреннего хэш-значения

RS384

const sig = new KJUR.crypto.Signature({ "alg": "SHA384withRSA" });
sig.init(privateKey);
sig.updateString("data");
const signature = sig.sign();

RS384 используется в системах, где требуется усиленная защита по сравнению с RS256, но без значительного увеличения нагрузки.

RS512

const sig = new KJUR.crypto.Signature({ "alg": "SHA512withRSA" });
sig.init(privateKey);
sig.updateString("data");
const signature = sig.sign();

RS512 обеспечивает максимальную криптостойкость в рамках RSA + SHA-2, однако требует больше вычислительных ресурсов.

Использование RS256/384/512 в JWT

Jsrsasign содержит встроенный модуль JWS для работы с JSON Web Signature.

Создание JWT с RS256

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
);

Верификация JWT

const isValid = KJUR.jws.JWS.verify(jwt, publicKey, ["RS256"]);

Для RS384 и RS512 изменение алгоритма производится аналогично:

  • "RS384"
  • "RS512"

Внутренний процесс формирования подписи

Процесс создания подписи включает несколько этапов:

  1. Формирование JSON header и payload
  2. Base64Url-кодирование
  3. Конкатенация header.payload
  4. Хэширование выбранным SHA-алгоритмом
  5. RSA-шифрование хэша приватным ключом

Фактически RS256/384/512 не шифрует данные, а подписывает хэш.

Особенности формата Base64Url

Jsrsasign автоматически применяет Base64Url encoding:

  • замена + на -
  • замена / на _
  • удаление =

Это критически важно для совместимости с JWT-стандартом RFC 7519.

Ошибки при работе с RS256/384/512

Наиболее распространённые проблемы:

Несовпадение алгоритма

Подпись, созданная с RS256, не может быть проверена как RS512.

Повреждение ключа

PEM-формат должен сохраняться без изменений:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

Изменение payload

Любое изменение данных делает подпись недействительной.

Производительность алгоритмов

Сравнение характеристик:

  • RS256 — минимальная нагрузка, высокая скорость
  • RS384 — средний баланс
  • RS512 — максимальная криптостойкость, медленнее остальных

На практике RS256 используется чаще всего, RS512 — в высокозащищённых системах.

Совместимость с другими библиотеками

Подписи Jsrsasign полностью совместимы с:

  • Node.js crypto
  • OpenSSL
  • Java JJWT
  • Python PyJWT

При условии одинакового алгоритма и корректного PEM-формата ключей.

Выбор алгоритма в зависимости от сценария

  • RS256 — API, веб-сервисы, мобильные приложения
  • RS384 — финансовые системы среднего уровня
  • RS512 — государственные и критически защищённые системы

Разница между ними проявляется только на уровне хэш-функции, RSA-механизм остаётся одинаковым.

Обработка ключей в Jsrsasign

Библиотека поддерживает:

  • PEM формат
  • DER формат
  • JWK (через конвертацию)

Конвертация PEM → объект ключа:

const keyObj = KEYUTIL.getKey(pemString);

Внутреннее представление RSA в Jsrsasign

RSA-ключи представлены как объекты с параметрами:

  • n (модуль)
  • e (экспонента)
  • d (приватная экспонента)
  • p, q (простые числа)

Эти значения используются для математической операции возведения в степень по модулю.

Роль SHA-2 в RS256/384/512

SHA-2 выполняет предварительное сжатие данных перед RSA-операцией. Это предотвращает:

  • атаки на длину сообщения
  • подделку структуры подписи
  • коллизии (в зависимости от выбранной длины хэша)

Итоговые технические особенности реализации в Jsrsasign

  • полностью синхронная модель вычислений
  • отсутствие внешних зависимостей
  • поддержка чистого JavaScript
  • работа в браузере и Node.js
  • соответствие RFC 7518 (JWA)