RSA-OAEP относится к семейству алгоритмов асимметричного шифрования ключа в стандарте JWE (JSON Web Encryption), используемом в экосистеме JOSE. В библиотеке jose эти алгоритмы применяются для защиты CEK (Content Encryption Key), который затем используется симметрическим шифрованием основного содержимого.
В JWE структура шифрования разделяется на два уровня:
RSA-OAEP определяет способ, которым RSA используется для шифрования CEK с применением схемы Optimal Asymmetric Encryption Padding (OAEP). OAEP добавляет случайность и защитные преобразования перед RSA-операцией, устраняя детерминированность классического RSA.
RSA-OAEP без уточнения хэша в JWA традиционно использует SHA-1 внутри OAEP:
Формально алгоритм обозначается как:
RSA-OAEPНесмотря на устаревание SHA-1 в криптографическом контексте подписи, в OAEP он сохраняет ограниченное применение, поскольку используется только внутри padding-схемы, а не как механизм целостности.
Особенности:
Более современный вариант:
Обозначение:
RSA-OAEP-256В большинстве современных реализаций JOSE этот алгоритм является предпочтительным.
Причины использования:
В реализации jose данный алгоритм является стандартным выбором при работе с RSA-шифрованием.
В официальной спецификации JWA (RFC 7518) определены только:
Алгоритмы:
RSA-OAEP-384RSA-OAEP-512не входят в базовый стандарт, однако в некоторых криптографических библиотеках и расширениях могут встречаться как:
Логика таких вариантов:
В JOSE-экосистеме их поддержка зависит от конкретной реализации и
криптографического backend’а (например, Node.js
crypto).
Работа с RSA-OAEP в jose строится вокруг функций
EncryptJWT, jwtEncrypt,
CompactEncrypt, importSPKI,
importPKCS8.
RSA-ключи обычно создаются через системные инструменты или Node.js crypto:
import { generateKeyPair } from 'node:crypto'
generateKeyPair('rsa', {
modulusLength: 2048,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem'
}
}, (err, publicKey, privateKey) => {
// ключи готовы
})
import { importSPKI, importPKCS8 } from 'jose'
const publicKey = await importSPKI(publicKeyPem, 'RSA-OAEP-256')
const privateKey = await importPKCS8(privateKeyPem, 'RSA-OAEP-256')
Обозначение алгоритма при импорте фиксирует контекст допустимого использования ключа.
import { CompactEncrypt } from 'jose'
const encoder = new TextEncoder()
const jwe = await new CompactEncrypt(
encoder.encode('секретные данные')
)
.setProtectedHeader({
alg: 'RSA-OAEP-256',
enc: 'A256GCM'
})
.encrypt(publicKey)
Ключевые элементы:
alg: RSA-OAEP-256 — защита ключаenc: A256GCM — симметрическое шифрование данныхimport { compactDecrypt } from 'jose'
const { plaintext } = await compactDecrypt(jwe, privateKey)
console.log(new TextDecoder().decode(plaintext))
const publicKey = await importSPKI(publicKeyPem, 'RSA-OAEP')
.setProtectedHeader({
alg: 'RSA-OAEP',
enc: 'A256GCM'
})
Этот вариант используется в системах, где требуется совместимость со старыми OAuth2 / OpenID Connect провайдерами.
RSA-OAEP:
RSA-OAEP-256:
Разница проявляется только на уровне KDF/OAEP padding, а не в самом RSA-математическом ядре.
Шифруется только CEK Основные данные всегда
шифруются симметрическим алгоритмом (enc).
Не влияет на размер payload напрямую RSA применяется только к ключу.
Критична совместимость сторон Обе стороны должны
поддерживать одинаковый alg.
Зависимость от криптопровайдера Node.js crypto, WebCrypto API и OpenSSL могут иметь разные ограничения.
Практическая логика выбора:
При этом в инфраструктуре jose обычно фиксируется строгий список допустимых alg через политики валидации заголовков JWE.
OAEP строится на двух внутренних функциях:
Схематично процесс:
Эта конструкция устраняет детерминированность RSA и делает схему семантически безопасной при корректной реализации.
| Алгоритм | SHA внутри | Совместимость | Статус |
|---|---|---|---|
| RSA-OAEP | SHA-1 | высокая | legacy |
| RSA-OAEP-256 | SHA-256 | высокая | стандарт |
| RSA-OAEP-384 | SHA-384 | ограниченная | расширение |
| RSA-OAEP-512 | SHA-512 | ограниченная | расширение |
RSA-OAEP часто используется в гибридной схеме:
Такая комбинация позволяет: