Пространство имён KEYUTIL

Пространство имён KEYUTIL библиотеки jsrsasign представляет собой центральный набор утилит для работы с криптографическими ключами. Оно обеспечивает создание, преобразование, импорт и экспорт ключей различных форматов, включая PEM, DER, PKCS#1, PKCS#5, PKCS#8 и JWK.

Функциональность KEYUTIL охватывает как симметричные, так и асимметричные ключи, включая RSA, DSA, ECDSA и современные эллиптические кривые.


Основные возможности

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

KEYUTIL позволяет создавать новые ключевые пары непосредственно в JavaScript-среде.

Пример генерации RSA-ключа:

var kp = KEYUTIL.generateKeypair("RSA", 2048);
var privateKey = kp.prvKeyObj;
var publicKey = kp.pubKeyObj;

Поддерживаемые алгоритмы:

  • RSA (различные длины ключа)
  • ECDSA (с выбором кривой, например secp256r1)
  • DSA

Пример генерации ECDSA:

var kp = KEYUTIL.generateKeypair("EC", "secp256r1");

Импорт ключей

Чтение ключей из PEM

Наиболее распространённый сценарий — загрузка ключей из PEM-строки:

var key = KEYUTIL.getKey(pemString);

Функция автоматически определяет:

  • тип ключа (RSA, EC, DSA)
  • формат (PKCS#1, PKCS#8)
  • наличие шифрования

Работа с зашифрованными ключами

Если ключ защищён паролем:

var key = KEYUTIL.getKey(pemString, "password");

Поддерживаются:

  • PKCS#5 (традиционный формат)
  • PKCS#8 (современный формат)

Экспорт ключей

Преобразование в PEM

Экспорт приватного ключа:

var pem = KEYUTIL.getPEM(privateKey, "PKCS1PRV");

Экспорт публичного ключа:

var pem = KEYUTIL.getPEM(publicKey);

Экспорт в PKCS#8

var pem = KEYUTIL.getPEM(privateKey, "PKCS8PRV");

С шифрованием:

var pem = KEYUTIL.getPEM(privateKey, "PKCS8PRV", "password");

Работа с JWK

Формат JSON Web Key используется в веб-приложениях и стандартах вроде JWT.

Импорт JWK

var key = KEYUTIL.getKey(jwkObject);

Пример JWK:

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

Экспорт в JWK

var jwk = KEYUTIL.getJWK(privateKey);

Преобразование форматов

KEYUTIL позволяет конвертировать ключи между форматами:

  • PEM → объект ключа → JWK
  • JWK → объект → PEM
  • DER ↔︎ PEM

Пример:

var keyObj = KEYUTIL.getKey(pem);
var jwk = KEYUTIL.getJWK(keyObj);

Работа с сертификатами

KEYUTIL способен извлекать публичные ключи из X.509 сертификатов:

var key = KEYUTIL.getKey(certPEM);

Это особенно важно при работе с TLS, цифровыми подписями и инфраструктурой открытых ключей (PKI).


Поддержка алгоритмов

KEYUTIL интегрируется с криптографическими примитивами библиотеки:

  • RSA (PKCS#1 v1.5, PSS)
  • ECDSA
  • DSA

Используется совместно с модулями:

  • KJUR.crypto.Signature
  • KJUR.crypto.Cipher

Проверка типа ключа

После загрузки ключа доступна информация о типе:

if (key instanceof RSAKey) {
    // RSA ключ
}

Для EC:

if (key.curveName !== undefined) {
    // EC ключ
}

Внутреннее представление

Объекты ключей в KEYUTIL представлены специализированными классами:

  • RSAKey
  • KJUR.crypto.ECDSA
  • KJUR.crypto.DSA

Каждый класс содержит:

  • параметры ключа (n, e, d для RSA)
  • методы криптографических операций

Безопасность и ограничения

Работа в браузере

  • Генерация ключей может быть медленной (особенно RSA 4096)
  • Отсутствие аппаратного ускорения

Защита приватных ключей

  • Хранение в памяти JavaScript небезопасно
  • Рекомендуется использовать Web Crypto API для production

Интеграция с другими модулями

Пример использования ключа для подписи:

var sig = new KJUR.crypto.Signature({alg: "SHA256withRSA"});
sig.init(privateKey);
sig.updateString("data");
var signature = sig.sign();

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

sig.init(publicKey);
var isValid = sig.verify(signature);

Расширенные возможности

Загрузка ключа из DER

var key = KEYUTIL.getKeyFromPlainPrivatePKCS8Hex(hexString);

Получение параметров ключа

var modulus = key.n.toString(16);
var exponent = key.e.toString(16);

Типичные сценарии использования

  • Подпись и проверка JWT
  • Работа с TLS-сертификатами
  • Генерация ключей для API
  • Шифрование данных на клиенте
  • Интеграция с OAuth и OpenID Connect

Производительность

  • RSA: медленно при больших ключах
  • EC: быстрее и компактнее
  • JWK: удобен для передачи по сети

Практические замечания

  • PEM — предпочтительный формат для хранения
  • JWK — стандарт для REST API
  • PKCS#8 — универсальный формат для приватных ключей
  • Всегда проверять корректность входных данных перед загрузкой ключа

Связь с криптографическими стандартами

KEYUTIL реализует поддержку:

  • PKCS#1
  • PKCS#8
  • X.509

Это делает его универсальным инструментом для работы с криптографией в веб-приложениях.