Метод crypto.subtle.generateKey() предназначен для
генерации криптографических ключей в рамках Web Crypto API. Он
используется для создания как симметричных, так и асимметричных ключей,
которые впоследствии применяются для шифрования, дешифрования,
подписания данных и проверки подписей.
Метод работает асинхронно и возвращает Promise, который
резолвится в объект ключа или пару ключей в зависимости от выбранного
алгоритма.
crypto.subtle.generateKey(algorithm, extractable, keyUsages)
Параметры:
Для симметричных алгоритмов — объект
CryptoKey
Для асимметричных алгоритмов — объект
CryptoKeyPair:
{
publicKey: CryptoKey,
privateKey: CryptoKey
}const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
);
Пояснения:
length: длина ключа в битах (128, 192 или 256)extractable: true позволяет экспортировать ключkeyUsages: операции шифрования и дешифрованияconst key = await crypto.subtle.generateKey(
{
name: "HMAC",
hash: "SHA-256",
length: 256
},
true,
["sign", "verify"]
);
Особенности:
hash: используемый хэш-алгоритмconst keyPair = await crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["encrypt", "decrypt"]
);
Параметры:
modulusLength: длина модуля (2048 или 4096)publicExponent: обычно [1, 0, 1]
(65537)hash: алгоритм хэшированияconst keyPair = await crypto.subtle.generateKey(
{
name: "RSA-PSS",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["sign", "verify"]
);
const keyPair = await crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-256"
},
true,
["sign", "verify"]
);
Поддерживаемые кривые:
const keyPair = await crypto.subtle.generateKey(
{
name: "ECDH",
namedCurve: "P-256"
},
false,
["deriveKey", "deriveBits"]
);
Особенности:
extractable: false — приватный ключ не может быть
экспортированextractableОпределяет, можно ли извлечь ключ из CryptoKey в виде
сырого материала.
true — ключ можно экспортировать (например, через
exportKey)false — ключ остается внутри криптографического
контекстаВажно: закрытые ключи часто делают неэкспортируемыми для повышения безопасности.
keyUsagesОпределяет, какие операции разрешены для ключа:
| Значение | Назначение |
|---|---|
| encrypt | Шифрование |
| decrypt | Дешифрование |
| sign | Подпись |
| verify | Проверка подписи |
| deriveKey | Генерация ключа |
| deriveBits | Генерация битов |
| wrapKey | Оборачивание ключа |
| unwrapKey | Разворачивание ключа |
Несоответствие между алгоритмом и keyUsages приводит к
ошибке.
Метод может выбрасывать исключения:
SyntaxError — неверные параметрыNotSupportedError — алгоритм не поддерживаетсяInvalidAccessError — некорректные
keyUsagesПример обработки:
try {
const key = await crypto.subtle.generateKey(...);
} catch (error) {
console.error(error);
}
Шифрование данных:
Аутентификация:
Обмен ключами:
Цифровая подпись:
Сгенерированные ключи используются в:
crypto.subtle.encrypt()crypto.subtle.decrypt()crypto.subtle.sign()crypto.subtle.verify()crypto.subtle.deriveKey()crypto.subtle.exportKey()crypto.webcrypto.subtle1. Неправильные keyUsages:
["encrypt"] // для RSA-PSS — ошибка
2. Неверный алгоритм:
{ name: "AES", length: 256 } // должно быть AES-GCM, AES-CBC и т.д.
3. Попытка экспортировать неэкспортируемый ключ:
extractable: false
console.log(key instanceof CryptoKey); // true
Для пары ключей:
console.log(keyPair.publicKey);
console.log(keyPair.privateKey);