В библиотеке Jsrsasign ключи являются центральным элементом всей криптографической инфраструктуры. Они используются для асимметричного шифрования, цифровой подписи, проверки подписи, а также для обмена ключами и интеграции с симметричными алгоритмами.
Основные типы ключей, поддерживаемые библиотекой:
Jsrsasign работает с несколькими стандартными форматами ключей:
Наиболее распространённый формат:
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
или
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
PEM используется для импорта и экспорта ключей в большинстве криптографических сценариев.
PKCS#8 чаще применяется в современных системах, так как поддерживает расширяемость.
Формат JSON, активно используемый в веб-приложениях:
{
"kty": "RSA",
"n": "...",
"e": "AQAB",
"d": "..."
}
Jsrsasign поддерживает конвертацию между PEM и JWK, что удобно при работе с JWT.
В Jsrsasign генерация RSA ключей выполняется через
KEYUTIL.
var rsaKey = KEYUTIL.generateKeypair("RSA", 2048);
var privateKey = rsaKey.prvKeyObj;
var publicKey = rsaKey.pubKeyObj;
Параметры:
RSA — тип алгоритма2048 — длина ключа в битах (минимально безопасный
уровень)Для повышенной безопасности используется 3072 или 4096 бит.
var pem = `
-----BEGIN PRIVATE KEY-----
MIIEv...
-----END PRIVATE KEY-----
`;
var keyObj = KEYUTIL.getKey(pem);
Функция KEYUTIL.getKey автоматически определяет тип
ключа и формат.
var jwk = {
kty: "RSA",
n: "...",
e: "AQAB",
d: "..."
};
var keyObj = KEYUTIL.getKey(jwk);
var pemPrivate = KEYUTIL.getPEM(privateKey, "PKCS8PRV");
var pemPublic = KEYUTIL.getPEM(publicKey);
Типы экспорта:
PKCS1PRV — RSA приватный ключ PKCS#1PKCS8PRV — универсальный приватный ключPKCS8PUB — публичный ключvar jwk = KEYUTIL.getJWK(privateKey);
Экспорт JWK особенно важен для JWT-инфраструктур и OAuth 2.0 систем.
RSA ключи используются для:
var sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(privateKey);
sig.updateString("data to sign");
var signature = sig.sign();
var sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(publicKey);
sig.updateString("data to sign");
var isValid = sig.verify(signature);
Elliptic Curve ключи компактнее RSA и используются в:
var ecKey = KEYUTIL.generateKeypair("EC", "secp256r1");
Популярные кривые:
var sig = new KJUR.crypto.Signature({ "alg": "SHA256withECDSA" });
sig.init(ecKey.prvKeyObj);
sig.updateString("message");
var sigValue = sig.sign();
Jsrsasign хранит ключи в виде объектов RSAKey или
KJUR.crypto.ECDSA.
Ключевые свойства:
n, e — RSA публичные параметрыd — RSA приватный экспонентcurveName — EC криваяpubKeyHex — публичное представлениеПри работе с Jsrsasign важно учитывать:
Вектор инициализации используется в симметричном шифровании для повышения криптографической стойкости. В Jsrsasign IV применяется в алгоритмах:
IV обеспечивает:
Для генерации случайных значений используется
KJUR.crypto.Util
var ivHex = KJUR.crypto.Util.getRandomHexOfNbytes(16);
16 байт = 128 бит (стандарт для AES-CBC)
var aes = new KJUR.crypto.Cipher({
alg: "AES",
mode: "CBC",
iv: ivHex
});
var encrypted = aes.encrypt("AES ключ", "секретные данные");
var decrypted = aes.decrypt("AES ключ", encrypted);
Важно: IV должен быть одинаковым при шифровании и расшифровании.
В режиме GCM IV часто называется nonce.
var iv = KJUR.crypto.Util.getRandomHexOfNbytes(12);
12 байт — рекомендуемый размер для GCM.
var cipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "GCM",
iv: iv
});
Типичные ошибки:
Ключ и IV выполняют разные функции:
Даже при одинаковом ключе разные IV дают разные шифротексты.
Частая практика — объединение:
IV + ciphertext
или
base64(iv + encrypted)
Это позволяет использовать IV при расшифровке без отдельной передачи.
Гибридная схема:
var aesKey = "random-aes-key";
var iv = KJUR.crypto.Util.getRandomHexOfNbytes(16);
var cipher = new KJUR.crypto.Cipher({
alg: "AES",
mode: "CBC",
iv: iv
});
var encryptedData = cipher.encrypt(aesKey, "data");
Критические параметры:
Jsrsasign часто используется в связке с:
Поэтому конвертация ключей между PEM и JWK становится обязательной операцией при интеграции систем.
var key = KEYUTIL.getKey(pemPrivate);
var jwk = KEYUTIL.getJWK(key);
В прикладных сценариях ключи используются в:
IV при этом используется внутри транспортного или прикладного уровня шифрования, а ключи — на уровне идентификации и криптографической подписи.