В библиотеке Jose генерация асимметрических ключей реализована через
функцию generateKeyPair, которая опирается на Web Crypto
API и возвращает пару ключей: публичный и приватный. Эти ключи
используются в сценариях подписи JWT (JWS) и шифрования (JWE), где
требуется разделение ролей между сторонами.
Основная особенность подхода заключается в том, что ключи создаются средствами криптографического провайдера окружения (Node.js или браузер), а не вручную через произвольные алгоритмы.
Функция поддерживает набор криптографических алгоритмов, каждый из которых выбирается в зависимости от требований безопасности и совместимости:
Выбор алгоритма определяет как структуру ключей, так и криптографические ограничения.
Функция возвращает объект с двумя ключами, которые могут быть использованы отдельно:
import { generateKeyPair } from 'jose'
const { publicKey, privateKey } = await generateKeyPair('RS256')
Результат представляет собой два объекта CryptoKey. Они
совместимы с WebCrypto и могут быть напрямую переданы в функции подписи
или верификации JWT.
generateKeyPair позволяет управлять поведением
создаваемых ключей через дополнительные параметры:
extractable — разрешает ли извлечение ключа (например,
экспорт в JWK)keyUsages — сценарии использования ключа
(sign, verify, encrypt,
decrypt)Пример:
const { publicKey, privateKey } = await generateKeyPair('ES256', {
extractable: true,
keyUsages: ['sign', 'verify']
})
Контроль keyUsages особенно важен, так как WebCrypto
строго ограничивает операции, доступные каждому ключу.
В Node.js используется встроенный модуль
crypto.webcrypto, начиная с современных версий Node. В
браузере используется нативный window.crypto.subtle.
Разница не видна на уровне API Jose, но влияет на производительность и доступность алгоритмов в старых окружениях.
generateSecretФункция generateSecret используется для создания
симметрических ключей, которые применяются в алгоритмах HMAC и некоторых
сценариях JWE. В отличие от асимметрических ключей, здесь используется
один общий секрет для подписи и проверки.
Чаще всего симметрические ключи используются с:
Симметрические ключи подходят для сценариев, где доверенная сторона одна или где распределение ключа контролируется централизованно.
Базовый вызов:
import { generateSecret } from 'jose'
const secret = await generateSecret('HS256')
Результатом является объект CryptoKey, который может
использоваться для подписания и проверки JWT.
В отличие от generateKeyPair, здесь не возвращается пара
ключей. Генерируется один криптографически стойкий секрет, размер
которого соответствует требованиям алгоритма.
Для HS256 это обычно 256-битный ключ, однако библиотека сама обеспечивает корректную длину, соответствующую выбранному алгоритму.
import { generateSecret, SignJWT } from 'jose'
const secret = await generateSecret('HS256')
const jwt = await new SignJWT({ sub: '1234567890' })
.setProtectedHeader({ alg: 'HS256' })
.sign(secret)
generateKeyPair и generateSecretРазница между этими функциями определяется моделью криптографии:
Асимметричная модель
(generateKeyPair):
Симметричная модель
(generateSecret):
Ключи, созданные через Jose, являются объектами WebCrypto
CryptoKey, что накладывает ряд особенностей:
extractable: trueПример ограничения:
const { privateKey } = await generateKeyPair('RS256', {
extractable: false
})
Такой ключ нельзя экспортировать, что повышает безопасность при работе в серверных приложениях.
Генерация ключей в Jose тесно связана с последующим использованием в:
SignJWTjwtVerifyEncryptJWTjwtDecryptАссиметричные ключи чаще используются для распределённых систем авторизации, где публичный ключ публикуется, а приватный хранится на сервере.
Симметричные ключи применяются в внутренних сервисах или при ограниченной модели доверия.
При работе с generateKeyPair и
generateSecret часто возникают проблемы, связанные не с
библиотекой, а с криптографическими ограничениями окружения:
extractable: truekeyUsages с операцией подписи или
шифрованияCryptoKeyЭти ограничения являются частью WebCrypto и не обходятся на уровне Jose.