Управление криптографическими ключами в Jsrsasign строится вокруг
унифицированного слоя KEYUTIL, который абстрагирует
различия между RSA, EC и различными форматами представления ключей.
Ключевая задача библиотеки — обеспечить взаимную конвертацию, генерацию,
парсинг и безопасную работу с ключевыми материалами без привязки к
низкоуровневым API WebCrypto.
В экосистеме Jsrsasign один и тот же ключ может существовать в нескольких формах:
Наиболее распространённый текстовый формат, основанный на Base64 с заголовками:
-----BEGIN PRIVATE KEY----------BEGIN RSA PRIVATE KEY----------BEGIN PUBLIC KEY-----PEM используется для хранения и передачи ключей между системами и является основным форматом взаимодействия в Jsrsasign.
Бинарное представление ключа. В Jsrsasign встречается реже, обычно при работе с внешними криптографическими системами.
PKCS#8 является предпочтительным для универсальной обработки в Jsrsasign.
JSON-структура, используемая в современных web-протоколах:
{
"kty": "RSA",
"n": "...",
"e": "AQAB",
"d": "..."
}
Jsrsasign поддерживает преобразование JWK ↔︎ PEM.
Генерация ключей выполняется через
KEYUTIL.generateKeypair.
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;
Параметры:
RSA — алгоритм2048 / 3072 / 4096 — длина ключаГенерация RSA включает создание простых чисел, вычисление модуля
n, открытой экспоненты e и закрытой экспоненты
d.
const kp = KEYUTIL.generateKeypair("EC", "secp256r1");
Используемые кривые:
secp256r1 (P-256)secp384r1secp521r1EC-ключи компактнее RSA и чаще используются в современных протоколах (JWT, TLS 1.3).
const key = KEYUTIL.getKey(pemString);
KEYUTIL.getKey автоматически определяет тип ключа:
const key = KEYUTIL.getKey(jwkObject);
При этом происходит:
RSAKey или
KJUR.crypto.ECDSAconst key = KEYUTIL.getKey(pemEncrypted, "password");
Поддерживаются:
const pem = KEYUTIL.getPEM(privateKeyObj, "PKCS8PRV");
Типы экспорта:
"PKCS8PRV" — приватный ключ PKCS#8"PKCS1PRV" — RSA-specific"SPKI" — публичный ключconst jwk = KEYUTIL.getJWK(privateKeyObj);
Используется в web-API и OAuth2 / JWT инфраструктуре.
Jsrsasign преобразует внешние форматы в внутренние структуры:
Содержит:
n — модульe — публичная экспонентаd — приватная экспонентаp, q — простые множителиdp, dq, qi —
CRT-параметрыCRT ускоряет операции подписи и расшифровки.
Содержит:
curvepub — точка на кривойpriv — скалярное значениеKEYUTIL.getKey(pem);
Если ключ некорректен, выбрасывается исключение.
const sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(privateKey);
sig.updateString("data");
const signature = sig.sign();
const pub = KEYUTIL.getKey(publicKeyPem);
const verifier = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
verifier.init(pub);
verifier.updateString("data");
const isValid = verifier.verify(signature);
Для идентификации ключей используется fingerprint:
const fp = KEYUTIL.getKey(publicKeyPem).getPublicKey().getFingerprint();
Алгоритмы:
Fingerprint применяется для:
Алгоритмическая ротация ключей включает:
key_v1key_v2Подпись проверяется по набору публичных ключей:
const keys = [key1, key2];
for (const k of keys) {
if (verifyWith(k)) break;
}
Поддерживается стратегия:
Jsrsasign не навязывает storage layer, но ключи часто:
const key = KEYUTIL.getKey(process.env.PRIVATE_KEY);
JavaScript не предоставляет гарантированного удаления памяти, поэтому:
const jwk = KEYUTIL.getJWK(KEYUTIL.getKey(pem));
const pem2 = KEYUTIL.getPEM(KEYUTIL.getKey(jwk));
Прямое преобразование невозможно, но возможно:
Ключи тесно связаны с алгоритмами:
SHA256withRSASHA512withRSASHA256withECDSAconst sig = new KJUR.crypto.Signature({
alg: "SHA256withECDSA"
});
sig.init(ecPrivateKey);
Критические аспекты:
KEYUTIL.getPEM(privateKeyObj, "PKCS8PRV");
Экспорт приватных ключей должен быть ограничен.
Генерация ключей RSA/EC требует криптографически стойкой энтропии, предоставляемой средой выполнения (Node.js или браузер).
Jsrsasign часто применяется в JWT-сценариях:
const token = KJUR.jws.JWS.sign(
"RS256",
header,
payload,
privateKey
);
Публичный ключ используется для проверки:
const isValid = KJUR.jws.JWS.verify(token, publicKey, ["RS256"]);
Для повышения производительности:
RSAKey сохраняетсяJsrsasign ключи совместимы с: