RSA остаётся одной из ключевых асимметричных схем, применяемых в протоколах JWS (JSON Web Signature) и JWE (JSON Web Encryption). В библиотеке Jose для JavaScript поддержка RSA реализована через набор стандартизированных алгоритмов, определённых спецификацией JOSE.
RSA основан на вычислительной сложности факторизации больших чисел и используется в двух основных сценариях:
RSA опирается на пару взаимосвязанных ключей:
Ключевая идея строится на модульной арифметике:
m^e n
и обратной операции:
m^d n
где:
Без знания разложения n восстановить d практически невозможно при корректных размерах ключа.
В JOSE RSA применяется в двух категориях алгоритмов:
Механизм: данные сначала хэшируются, затем подпись формируется с использованием приватного ключа.
Эти алгоритмы применяются для шифрования симметричного ключа, который затем используется для основного контента.
Библиотека Jose предоставляет высокоуровневый API для работы с JWS и JWE.
import { generateKeyPair } from 'jose'
const { publicKey, privateKey } = await generateKeyPair('RS256', {
modulusLength: 2048
})
Параметр modulusLength определяет криптостойкость:
Подпись 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 часто используется не для шифрования данных напрямую, а для защиты симметрического ключа.
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)
Jose поддерживает несколько форматов ключей:
Часто используется в Node.js и инфраструктуре TLS.
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
Нативный формат JOSE:
{
"kty": "RSA",
"n": "...",
"e": "AQAB",
"d": "..."
}
JWK удобен для API и распределённых систем.
RSA ключ в JWK включает обязательные параметры:
kty — тип ключа (RSA)n — модульe — публичная экспонентаd — приватная экспонента (только для private key)p, q — простые множители (опционально, но
обычно присутствуют)RSA существенно медленнее симметричных алгоритмов. Поэтому:
Сложность операций возрастает экспоненциально с длиной ключа, что делает его вычислительно тяжёлым.
Современные системы почти всегда используют гибридную модель:
Причина — баланс между безопасностью и производительностью.
Рекомендуется использовать криптографически стойкие генераторы, встроенные в Node.js и браузерные WebCrypto API через Jose.
RSA ключи следует регулярно обновлять:
Типичные проблемы:
alg spoofing)Процесс формирования подписи:
Результат — компактная строка формата:
header.payload.signature
OAEP (Optimal Asymmetric Encryption Padding) добавляет случайность и защищает от атак на детерминированный RSA.
Основные свойства:
Безопасность зависит от:
Современные рекомендации:
Jose интегрируется с WebCrypto API, что позволяет:
RSA-операции часто выполняются внутри криптографических модулей ОС для повышения безопасности.