Семейство RSA PKCS#1: RS256, RS384, RS512

Криптографическая основа RSA PKCS#1

RSA PKCS#1 представляет собой стандарт, описывающий схему цифровой подписи и шифрования на основе асимметричной криптографии RSA. В контексте JWT и библиотеки jose рассматривается исключительно подпись, основанная на приватном и публичном ключах.

В основе лежит принцип разделения ключей:

  • Приватный ключ используется для создания подписи
  • Публичный ключ используется для проверки подписи

RSA PKCS#1 v1.5 — классическая схема подписи, применяемая в JWT через алгоритмы семейства RS*.

Ключевой особенностью является использование хэш-функций перед операцией RSA:

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

Таким образом, RSA не подписывает данные напрямую, а работает с их криптографическим хэшем фиксированной длины.


Семейство алгоритмов RS256, RS384, RS512

Алгоритмы RS256, RS384 и RS512 относятся к одной криптографической схеме, различаясь только используемой хэш-функцией.

RS256 (RSA + SHA-256)

: (m)

Наиболее распространённый вариант в JWT. Обеспечивает баланс между безопасностью и производительностью. SHA-256 формирует 256-битный хэш, который затем подписывается RSA.

Используется по умолчанию во многих системах аутентификации.


RS384 (RSA + SHA-384)

: (m)

Вариант с усиленной криптографической стойкостью за счёт более длинного хэша. SHA-384 снижает вероятность коллизий по сравнению с SHA-256, однако требует немного больших вычислительных затрат.

Используется в системах с повышенными требованиями к долговременной защите данных.


RS512 (RSA + SHA-512)

: (m)

Максимальная стойкость в рамках семейства RS*. Использует SHA-512, обеспечивая более высокий уровень криптографической надёжности за счёт увеличенного размера хэша.

Применяется там, где приоритетом является устойчивость к атакам на хэш-функции, а не скорость.


Роль библиотеки jose в работе с RS* алгоритмами

Библиотека jose реализует современный подход к работе с JSON Web Tokens, включая поддержку RSA PKCS#1 через алгоритмы RS256, RS384 и RS512.

Основные задачи библиотеки в данном контексте:

  • создание JWT с цифровой подписью
  • проверка подлинности токенов
  • работа с PEM/PKCS#8 ключами
  • строгая реализация спецификации JOSE (JSON Object Signing and Encryption)

В отличие от устаревших решений, jose ориентирована на Web Crypto API и современные стандарты безопасности.


Формирование RSA ключей

RSA требует пары ключей:

  • приватный ключ (PEM, PKCS#8)
  • публичный ключ (PEM, SPKI)

Пример структуры:

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

Приватный ключ хранится в защищённой среде и никогда не передаётся клиенту.


Создание JWT с RS256 в jose

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

  1. Формирование payload
  2. Импорт приватного ключа
  3. Подписание JWT
import { SignJWT, importPKCS8 } from 'jose'

const privateKeyPem = `
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
`

const privateKey = await importPKCS8(privateKeyPem, 'RS256')

const jwt = await new SignJWT({ sub: 'user123' })
  .setProtectedHeader({ alg: 'RS256' })
  .setIssuedAt()
  .setExpirationTime('2h')
  .sign(privateKey)

Ключевым моментом является явное указание алгоритма в заголовке alg.


Проверка JWT с публичным ключом

Проверка подписи осуществляется через публичный ключ:

import { jwtVerify, importSPKI } from 'jose'

const publicKeyPem = `
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
`

const publicKey = await importSPKI(publicKeyPem, 'RS256')

const { payload, protectedHeader } = await jwtVerify(token, publicKey, {
  algorithms: ['RS256']
})

Валидация включает:

  • проверку подписи RSA
  • проверку хэша SHA-256 (или SHA-384/512)
  • контроль структуры JWT

Отличия RS256, RS384, RS512 в практическом применении

Несмотря на общую архитектуру, различия проявляются в следующих аспектах:

Криптографическая стойкость

  • RS256: стандартный уровень
  • RS384: повышенный запас прочности
  • RS512: максимальный уровень в семействе

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

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

Размер хэша

  • 256 / 384 / 512 бит соответственно

Взаимодействие RSA PKCS#1 с JWT структурой

JWT состоит из трёх частей:

header.payload.signature

Подпись формируется следующим образом:

= _{priv}((.))

Где:

  • Hash — SHA-256 / SHA-384 / SHA-512
  • RSA_priv — операция с приватным ключом
  • σ — итоговая подпись

Безопасность и типичные ошибки при использовании RS*

Несмотря на зрелость RSA PKCS#1, практическая реализация часто сопровождается ошибками:

1. Несоответствие алгоритма Использование RS256 в подписи и RS512 в проверке приводит к ошибке валидации.

2. Хранение приватного ключа Утечка приватного ключа полностью компрометирует систему подписи.

3. Отсутствие ограничения algorithms Если не фиксировать список допустимых алгоритмов при проверке, возможны атаки с подменой алгоритма.

jwtVerify(token, publicKey, {
  algorithms: ['RS256']
})

4. Использование устаревших библиотек Некорректная реализация PKCS#1 может приводить к уязвимостям padding oracle и signature confusion.


Совместимость и выбор алгоритма

Выбор между RS256, RS384 и RS512 определяется компромиссом между:

  • скоростью обработки токенов
  • уровнем криптографической стойкости
  • требованиями к инфраструктуре

RS256 остаётся де-факто стандартом в JWT-системах, тогда как RS384 и RS512 используются в высокозащищённых средах или при долгосрочном хранении токенизированных данных.