В библиотеке jose криптографические операции не реализуются вручную: они делегируются встроенному в среду выполнения механизму Web Crypto API, а именно интерфейсу SubtleCrypto. Это ключевой слой, через который происходят все операции подписи, проверки, шифрования и управления ключами. Архитектура построена так, чтобы исключить прямую работу с «сырыми» криптографическими алгоритмами и минимизировать вероятность ошибок, связанных с безопасностью.
Web Crypto API предоставляет объект crypto.subtle,
который является интерфейсом к нативной криптографической подсистеме
браузера или Node.js (через WebCrypto-полифил или встроенную
реализацию).
Основная идея SubtleCrypto заключается в том, что криптографические операции выполняются вне JavaScript-рантайма, на уровне платформы:
Jose полностью опирается на этот слой, не реализуя криптографию самостоятельно.
Библиотека jose строится вокруг стандарта JOSE (JSON Object Signing and Encryption), включающего:
Каждый из этих компонентов использует SubtleCrypto как исполнительный механизм.
При вызове, например, подписи JWT, jose не выполняет математические операции самостоятельно. Вместо этого происходит трансляция параметров JOSE в формат Web Crypto API:
В jose ключи часто представлены в формате JWK (JSON Web Key). Однако
SubtleCrypto работает с объектами CryptoKey. Поэтому важным
этапом является импорт и экспорт ключей.
Процесс импорта:
crypto.subtle.importKeyВнутри SubtleCrypto ключ становится непрозрачным объектом. Его содержимое недоступно напрямую, что снижает риск утечки секретов через JavaScript-уровень.
Экспорт возможен только при явном разрешении
(extractable: true), что используется редко в
продакшн-криптографии.
Подписание в jose проходит через цепочку:
header.payloadДля алгоритмов RSA-PSS или ECDSA происходит вызов:
crypto.subtle.sign(algorithm, privateKey, data)SubtleCrypto возвращает бинарную подпись, которая затем кодируется в base64url.
Для проверки подписи:
crypto.subtle.verify(algorithm, publicKey, signature, data)Jose лишь координирует этот процесс, не вмешиваясь в криптографическую часть.
В JWE процесс значительно сложнее, так как включает гибридную криптографию:
SubtleCrypto используется для всех этапов:
crypto.subtle.encrypt() для симметричного
шифрованияcrypto.subtle.decrypt() для обратной операцииcrypto.subtle.wrapKey() и unwrapKey() для
работы с CEKОсобенно важно, что AES-GCM реализуется нативно, включая аутентификационные теги, что исключает необходимость ручной реализации MAC.
JOSE определяет набор алгоритмов, каждый из которых имеет соответствие в Web Crypto API.
RSA:
ECC:
Symmetric:
SubtleCrypto требует явного указания параметров:
Jose выполняет этот маппинг автоматически, скрывая сложность от прикладного уровня.
SubtleCrypto работает с бинарными данными в формате
ArrayBuffer. Однако JOSE использует текстовый формат JSON и
base64url.
Поэтому jose включает слой преобразований:
Этот слой критичен, так как любая ошибка кодирования приводит к невозможности проверки подписи или расшифровки.
Все операции SubtleCrypto являются асинхронными и возвращают Promise. Это связано с тем, что криптография выполняется вне основного потока JavaScript.
Jose строит API поверх этой модели:
await sign()await verify()await encrypt()await decrypt()Это позволяет избежать блокировки event loop при больших payload или сложных ключах RSA/ECC.
SubtleCrypto накладывает ряд ограничений, которые напрямую влияют на поведение jose:
Также важно, что криптографические операции выполняются в изолированной среде, что снижает риск утечек через side-channel на уровне JavaScript.
В Node.js SubtleCrypto предоставляется через встроенный модуль
crypto.webcrypto. Jose использует его автоматически при
наличии.
Особенности:
Однако возможны различия в доступности некоторых кривых ECC или режимов AES, что учитывается в jose через fallback-механизмы.
Jose фактически выступает как адаптер между стандартом JOSE и Web Crypto API:
SubtleCrypto остаётся единственным криптографическим движком, а jose — слоем оркестрации и стандартизации.
Типичный поток внутри jose выглядит следующим образом:
Каждый этап строго детерминирован и не содержит скрытой логики вне Web Crypto API.
Использование SubtleCrypto даёт ключевые свойства:
Это делает jose не криптографической библиотекой в классическом смысле, а высокоуровневым протокол-адаптером над системной криптографией.