В Web Crypto API генерация асимметричных ключей выполняется через
crypto.subtle.generateKey(). Поведение функции полностью
определяется объектом параметров алгоритма, который описывает
криптографическую схему, длину ключа, параметры эллиптической кривой или
хэш-функцию, а также назначение ключей.
Общий вид вызова:
const keyPair = await crypto.subtle.generateKey(
algorithm,
extractable,
keyUsages
);
Каждый из трёх аргументов влияет на итоговую структуру ключевого материала и его применимость.
Для RSA-алгоритмов объект параметров содержит несколько обязательных полей:
const algorithm = {
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
};
nameОпределяет тип алгоритма:
"RSA-OAEP" — шифрование и расшифрование"RSASSA-PKCS1-v1_5" — цифровая подпись"RSA-PSS" — современный вариант подписи с вероятностным
дополнениемВыбор алгоритма влияет на допустимые keyUsages.
modulusLengthДлина RSA-ключа в битах:
Увеличение длины напрямую влияет на:
publicExponentОбычно фиксированное значение:
new Uint8Array([1, 0, 1]) // 65537
Это стандартный публичный экспонент RSA, выбранный из-за оптимального баланса между безопасностью и производительностью. Альтернативные значения встречаются редко и требуют строгого обоснования.
hashОпределяет хэш-функцию, используемую внутри алгоритма:
"SHA-1" — устаревший, не рекомендуется"SHA-256" — стандартный вариант"SHA-384", "SHA-512" — повышенная
криптостойкостьХэш-функция влияет на внутреннюю схему паддинга и устойчивость к коллизиям.
Генерация ключей на эллиптических кривых требует более компактного набора параметров.
const algorithm = {
name: "ECDSA",
namedCurve: "P-256"
};
namedCurveОпределяет используемую кривую:
"P-256" (secp256r1) — наиболее распространённая"P-384" — повышенная криптостойкость"P-521" — максимальная стойкость в рамках стандартных
кривыхДля ECDH структура аналогична:
const algorithm = {
name: "ECDH",
namedCurve: "P-256"
};
Несмотря на одинаковые кривые, ключи не взаимозаменяемы из-за различий в назначении и операциях.
const extractable = true;
Параметр определяет возможность извлечения приватного ключа:
true — ключ можно экспортировать через
exportKeyfalse — ключ остаётся внутри криптографического
контекстаПрактическое значение:
false повышает безопасность (ключ нельзя украсть через
API)true требуется при резервном копировании или
переносеМассив назначений определяет, какие операции допустимы для ключа.
["encrypt", "decrypt", "wrapKey", "unwrapKey"]
["sign", "verify"]
["sign", "verify"]
["deriveKey", "deriveBits"]
Ошибки конфигурации keyUsages являются одной из частых
причин исключений InvalidAccessError.
const keyPair = await crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
false,
["encrypt", "decrypt"]
);
const keyPair = await crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-256"
},
true,
["sign", "verify"]
);
Для RSA увеличение modulusLength экспоненциально
повышает сложность факторизации, но также увеличивает вычислительные
затраты.
В ECC:
В RSA-OAEP и RSA-PSS выбор hash влияет на:
Некоторые реализации браузеров ограничивают допустимые комбинации алгоритмов и хэшей. Например, RSA-PSS с SHA-1 может быть запрещён.
Если указано:
["encrypt", "sign"]
для RSA-OAEP, возникнет ошибка, так как алгоритм не поддерживает подпись.
Если указать:
namedCurve: "secp256k1"
в большинстве браузеров это вызовет NotSupportedError,
хотя криптографически кривая широко используется в
блокчейн-системах.
Поддержка алгоритмов зависит от движка:
Параметры, заданные на этапе generateKey,
определяют:
encrypt/decryptsign/verifyimportKey/exportKeyНесоответствие между параметрами генерации и последующим использованием приводит к ошибкам уже на этапе выполнения криптоопераций.
Параметры генерации нельзя рассматривать изолированно. Они образуют связанную систему:
Ошибочная комбинация параметров приводит не к деградации безопасности, а к полной невозможности использования ключа.