Алгоритмы семейства RSA

RSA остаётся одной из ключевых асимметричных схем, применяемых в протоколах JWS (JSON Web Signature) и JWE (JSON Web Encryption). В библиотеке Jose для JavaScript поддержка RSA реализована через набор стандартизированных алгоритмов, определённых спецификацией JOSE.

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

  • цифровая подпись (JWS)
  • шифрование ключей (JWE)

Математическая основа RSA

RSA опирается на пару взаимосвязанных ключей:

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

Ключевая идея строится на модульной арифметике:

m^e n

и обратной операции:

m^d n

где:

  • m — сообщение или его числовое представление
  • e — открытая экспонента
  • d — закрытая экспонента
  • n — модуль, произведение двух больших простых чисел

Без знания разложения n восстановить d практически невозможно при корректных размерах ключа.


RSA в спецификации JOSE

В JOSE RSA применяется в двух категориях алгоритмов:

Подпись (JWS)

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

Механизм: данные сначала хэшируются, затем подпись формируется с использованием приватного ключа.

Шифрование (JWE)

  • RSA-OAEP
  • RSA-OAEP-256
  • RSA1_5 (устаревший и небезопасный)

Эти алгоритмы применяются для шифрования симметричного ключа, который затем используется для основного контента.


Использование RSA в библиотеке Jose

Библиотека Jose предоставляет высокоуровневый API для работы с JWS и JWE.

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

import { generateKeyPair } from 'jose'

const { publicKey, privateKey } = await generateKeyPair('RS256', {
  modulusLength: 2048
})

Параметр modulusLength определяет криптостойкость:

  • 2048 бит — минимально допустимый уровень
  • 3072 бит — рекомендуемый баланс
  • 4096 бит — повышенная стойкость

Подписание JWT с RSA (JWS)

Подпись JWT обеспечивает целостность и аутентичность данных.

import { SignJWT } from 'jose'

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

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

import { jwtVerify } from 'jose'

const { payload } = await jwtVerify(token, publicKey)

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


RSA в JWE: шифрование данных

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

Принцип гибридного шифрования

  1. генерируется случайный симметрический ключ
  2. данные шифруются этим ключом (например, AES)
  3. симметрический ключ шифруется RSA

Пример шифрования

import { EncryptJWT } from 'jose'

const jwt = await new EncryptJWT({ data: 'secret' })
  .setProtectedHeader({ alg: 'RSA-OAEP-256', enc: 'A256GCM' })
  .setIssuedAt()
  .setExpirationTime('2h')
  .encrypt(publicKey)

Расшифрование

import { jwtDecrypt } from 'jose'

const { payload } = await jwtDecrypt(token, privateKey)

Форматы ключей RSA

Jose поддерживает несколько форматов ключей:

1. PEM (PKCS#8 / PKCS#1)

Часто используется в Node.js и инфраструктуре TLS.

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

2. JWK (JSON Web Key)

Нативный формат JOSE:

{
  "kty": "RSA",
  "n": "...",
  "e": "AQAB",
  "d": "..."
}

JWK удобен для API и распределённых систем.


Структура RSA ключа в JOSE

RSA ключ в JWK включает обязательные параметры:

  • kty — тип ключа (RSA)
  • n — модуль
  • e — публичная экспонента
  • d — приватная экспонента (только для private key)
  • p, q — простые множители (опционально, но обычно присутствуют)

Безопасные и устаревшие алгоритмы

Рекомендуемые

  • RS256
  • RS384
  • RS512
  • RSA-OAEP-256

Не рекомендуемые

  • RSA1_5 (подвержен атакам padding oracle)
  • ключи менее 2048 бит

Особенности производительности RSA

RSA существенно медленнее симметричных алгоритмов. Поэтому:

  • используется только для подписи или обмена ключами
  • не применяется для шифрования больших объёмов данных

Сложность операций возрастает экспоненциально с длиной ключа, что делает его вычислительно тяжёлым.


Типичные сценарии применения в системах

Аутентификация

  • JWT с RS256
  • распределённые системы с публичной валидацией токенов

API безопасность

  • подпись запросов
  • проверка подлинности клиента

Шифрование ключей

  • защита AES-ключей в JWE
  • обмен секретами между сервисами

Взаимодействие RSA и симметричной криптографии

Современные системы почти всегда используют гибридную модель:

  • RSA — для обмена ключами и подписи
  • AES — для шифрования данных

Причина — баланс между безопасностью и производительностью.


Практические аспекты работы с ключами

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

Рекомендуется использовать криптографически стойкие генераторы, встроенные в Node.js и браузерные WebCrypto API через Jose.

Хранение

  • приватные ключи — в защищённых хранилищах (Vault, KMS)
  • публичные ключи — могут быть открыты

Ротация

RSA ключи следует регулярно обновлять:

  • снижение риска компрометации
  • соответствие политике безопасности

Ошибки при использовании RSA в JOSE

Типичные проблемы:

  • использование RSA1_5
  • слишком короткие ключи (1024 бит)
  • хранение приватных ключей в коде
  • отсутствие проверки алгоритма (alg spoofing)
  • смешивание ключей между окружениями

Внутреннее устройство подписи RS256

Процесс формирования подписи:

  1. формируется заголовок JWS
  2. кодируется payload
  3. вычисляется SHA-256 хэш
  4. хэш подписывается RSA приватным ключом

Результат — компактная строка формата:

header.payload.signature

Внутреннее устройство RSA-OAEP

OAEP (Optimal Asymmetric Encryption Padding) добавляет случайность и защищает от атак на детерминированный RSA.

Основные свойства:

  • предотвращает структурный анализ шифротекста
  • делает RSA семантически безопасным

Криптостойкость RSA в современных системах

Безопасность зависит от:

  • длины ключа
  • качества генерации простых чисел
  • корректного padding (OAEP, PSS)
  • отсутствия утечек по времени выполнения

Современные рекомендации:

  • минимум 2048 бит
  • предпочтительно 3072+ бит для долгосрочной защиты

Взаимодействие с WebCrypto и инфраструктурой

Jose интегрируется с WebCrypto API, что позволяет:

  • использовать аппаратное ускорение
  • задействовать HSM
  • работать в браузере без Node.js зависимостей

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