Библиотека jsrsasign предоставляет универсальные инструменты для загрузки, парсинга и использования криптографических ключей в различных форматах. На практике чаще всего встречаются три представления ключей:
Каждый из форматов имеет свои особенности, и библиотека предоставляет единый API для их обработки.
PEM-файл содержит Base64-кодированные данные, обрамлённые строками:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...
-----END PUBLIC KEY-----
или для приватного ключа:
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
Для загрузки ключа используется функция:
var key = KEYUTIL.getKey(pemString);
Особенности:
var key = KEYUTIL.getKey(pemString, "password");
После загрузки:
console.log(key.type); // "RSA", "EC" и др.
console.log(key.isPrivate); // true / false
DER — это бинарное представление ASN.1-структуры. В отличие от PEM:
DER-данные обычно представлены:
ArrayBuffervar hex = "3082010A0282010100...";
var key = KEYUTIL.getKey({hex: hex, format: "der"});
var b64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...";
var key = KEYUTIL.getKey(b64);
Если передан Base64 без PEM-заголовков, библиотека:
JWK — это JSON-объект. Пример RSA-публичного ключа:
{
"kty": "RSA",
"n": "sXch...base64url...",
"e": "AQAB"
}
Приватный ключ включает дополнительные поля:
{
"kty": "RSA",
"n": "...",
"e": "...",
"d": "...",
"p": "...",
"q": "...",
"dp": "...",
"dq": "...",
"qi": "..."
}
var key = KEYUTIL.getKey(jwkObject);
или:
var key = KEYUTIL.getKey(JSON.stringify(jwkObject));
kty: "RSA")kty: "EC")kty: "oct")Функция KEYUTIL.getKey принимает различные типы входных
данных:
| Формат | Тип входных данных |
|---|---|
| PEM | строка |
| DER | hex / Base64 |
| JWK | объект или JSON |
Это позволяет использовать единый механизм:
var key = KEYUTIL.getKey(input);
jsrsasign использует ASN.1-парсер для:
Пример извлечения параметров RSA:
console.log(key.n.toString(16)); // модуль
console.log(key.e.toString(10)); // экспонента
var key = KEYUTIL.getKey(pem);
var jwk = KEYUTIL.getJWKFromKey(key);
var key = KEYUTIL.getKey(jwk);
var pem = KEYUTIL.getPEM(key);
var key = KEYUTIL.getKey({hex: hex});
var pem = KEYUTIL.getPEM(key);
jsrsasign различает ключи автоматически:
if (key.isPrivate) {
// приватный ключ
} else {
// публичный ключ
}
Для публичного ключа доступны:
Для приватного:
PEM-файлы могут содержать сертификаты:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Извлечение ключа:
var cert = new X509();
cert.readCertPEM(pemCert);
var pubKey = cert.getPublicKey();
Типичные ошибки при загрузке:
Пример обработки:
try {
var key = KEYUTIL.getKey(data);
} catch (e) {
console.error("Ошибка загрузки ключа:", e);
}
Загрузка ключа независимо от формата:
function loadKey(input) {
try {
return KEYUTIL.getKey(input);
} catch (e) {
throw new Error("Не удалось загрузить ключ");
}
}
Использование:
var key = loadKey(pemOrDerOrJwk);
После загрузки ключ может использоваться с:
KJUR.crypto.SignatureKJUR.crypto.CipherKJUR.jws.JWSПример:
var sig = new KJUR.crypto.Signature({"alg": "SHA256withRSA"});
sig.init(key);
sig.updateString("data");
var signature = sig.sign();
Глубокая интеграция с форматами ключей делает jsrsasign универсальным инструментом для работы с криптографией в браузере и Node.js, обеспечивая совместимость с большинством стандартов и протоколов.