SubtleCrypto: метод generateKey()
Базовая реализация Широко доступна *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS), в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод generateKey() интерфейса SubtleCrypto используется для генерации нового ключа (для симметричных алгоритмов) или пары ключей (для алгоритмов с открытым ключом).
Синтаксис
generateKey(algorithm, extractable, keyUsages)
Параметры
algorithm-
Объект, определяющий тип генерируемого ключа и предоставляющий дополнительные параметры, специфичные для алгоритма.
- Для RSASSA-PKCS1-v1_5, RSA-PSS или RSA-OAEP: передайте объект
RsaHashedKeyGenParams. - Для ECDSA или ECDH: передайте объект
EcKeyGenParams. - Для HMAC: передайте объект
HmacKeyGenParams. - Для AES-CTR, AES-CBC, AES-GCM или AES-KW: передайте объект
AesKeyGenParams. - Для Ed25519: передайте строку
Ed25519или объект вида{ name: "Ed25519" }. - Для X25519: передайте строку
X25519или объект вида{ name: "X25519" }.
- Для RSASSA-PKCS1-v1_5, RSA-PSS или RSA-OAEP: передайте объект
extractable-
Булевое значение, указывающее, будет ли возможным экспортировать ключ с помощью
SubtleCrypto.exportKey()илиSubtleCrypto.wrapKey(). keyUsages-
Массив строк, указывающих, что можно сделать с новым сгенерированным ключом. Возможные значения элементов массива:
encrypt-
Ключ может быть использован для шифрования сообщений.
decrypt-
Ключ может быть использован для дешифрования сообщений.
sign-
Ключ может быть использован для подписи сообщений.
verify-
Ключ может быть использован для проверки подписей.
deriveKey-
Ключ может быть использован для вывода нового ключа.
deriveBits-
Ключ может быть использован для вывода битов.
wrapKey-
Ключ может быть использован для обертывания ключа.
unwrapKey-
Ключ может быть использован для развертывания ключа.
Возвращаемое значение
Объект Promise, который возвращает CryptoKey (для симметричных алгоритмов) или CryptoKeyPair (для алгоритмов с открытым ключом).
Исключения
Обещание отклоняется, когда возникает следующая ошибка:
-
SyntaxErrorDOMException -
Возникает, когда результатом является
CryptoKeyтипаsecretилиprivate, ноkeyUsagesпусто или неверно для типа алгоритма. -
SyntaxErrorDOMException -
Возникает, когда результатом является
CryptoKeyPair, и его атрибутprivateKey.usagesпуст или неверен для типа алгоритма.
Примеры
Примечание: Вы можете попробовать примеры на GitHub.
Генерация пары ключей RSA
Этот код генерирует пару ключей для шифрования RSA-OAEP. Посмотрите полный код на GitHub.
let keyPair = await window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["encrypt", "decrypt"],
);
Генерация пары ключей эллиптической кривой
Этот код генерирует пару ключей для подписи ECDSA. Посмотрите полный код на GitHub.
let keyPair = await window.crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-384",
},
true,
["sign", "verify"],
);
Генерация ключа HMAC
Этот код генерирует ключ для подписи HMAC. Посмотрите полный код на GitHub.
let key = await window.crypto.subtle.generateKey(
{
name: "HMAC",
hash: { name: "SHA-512" },
},
true,
["sign", "verify"],
);
Генерация ключа AES
Этот код генерирует ключ для шифрования AES-GCM. Посмотрите полный код на GitHub.
let key = await window.crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256,
},
true,
["encrypt", "decrypt"],
);
Генерация ключа Ed25519
Этот код генерирует пару ключей для подписи Ed25519. Он взят из исходного кода на GitHub, который можно запустить онлайн.
JavaScript
Код для генерации пары ключей с использованием алгоритма Ed25519 и отображения информации по каждому ключу показан ниже. Обратите внимание, что код выполняется в блоке try..catch, так как не все браузеры поддерживают этот алгоритм.
JavaScript сначала получает элементы #sign-button и #message <input>, а затем добавляет обработчик события click на кнопку. Обработчик события очищает журнал и выполняет другие операции, передавая содержимое элемента <input>.
const button = document.querySelector("#run-button");
const input = document.querySelector("#log");
button.addEventListener("click", () => {
// Clear log
logElement.innerText = "";
logElement.scrollTop = logElement.scrollHeight;
// Run test
test();
});
async function test() {
try {
// Create a key pair and use destructuring assignment to assign to variables
const { publicKey, privateKey } = await crypto.subtle.generateKey(
{
name: "Ed25519",
},
true,
["sign", "verify"],
);
// Log the properties of the keys
log(`publicKey: ${publicKey}`);
log(` type: ${publicKey.type}`);
log(` extractable: ${publicKey.extractable}`);
log(` algorithm: ${JSON.stringify(publicKey.algorithm)}`);
log(` usages: ${publicKey.usages}`);
log(`privateKey: ${privateKey}`);
log(` type: ${privateKey.type}`);
log(` extractable: ${privateKey.extractable}`);
log(` algorithm: ${JSON.stringify(privateKey.algorithm)}`);
log(` usages: ${privateKey.usages}`);
} catch (error) {
log(error);
}
}
Результат
Информация о созданных ключах будет выведена ниже (или строка ошибки, если браузер не разрешает создание ключа).
Генерация ключа X25519
Этот код генерирует пару открытого и закрытого ключей X25519, которые могут быть использованы в SubtleCrypto.deriveKey() для создания общего ключа или в SubtleCrypto.deriveBits() для создания общего секрета.
JavaScript
Код для генерации пары ключей с использованием алгоритма X25519 и отображения информации о каждом ключе показан ниже. Обратите внимание, что код выполняется в блоке try..catch, так как не все браузеры поддерживают этот алгоритм.
JavaScript сначала получает элементы #run-button и #log <input>, а затем добавляет обработчик события click на кнопку. Обработчик события очищает журнал, генерирует пару ключей X25519 и отображает некоторые её свойства.
const button = document.querySelector("#run-button");
const input = document.querySelector("#log");
button.addEventListener("click", () => {
// Clear log
logElement.innerText = "";
logElement.scrollTop = logElement.scrollHeight;
// Run test
test();
});
async function test() {
try {
// Create a key pair and use destructuring assignment to assign to variables
const { publicKey, privateKey } = await crypto.subtle.generateKey(
{
name: "X25519",
},
true,
["deriveKey", "deriveBits"],
);
// Log the properties of the keys
log(`publicKey: ${publicKey}`);
log(` type: ${publicKey.type}`);
log(` extractable: ${publicKey.extractable}`);
log(` algorithm: ${JSON.stringify(publicKey.algorithm)}`);
log(` usages: ${publicKey.usages}`);
log(`privateKey: ${privateKey}`);
log(` type: ${privateKey.type}`);
log(` extractable: ${privateKey.extractable}`);
log(` algorithm: ${JSON.stringify(privateKey.algorithm)}`);
log(` usages: ${privateKey.usages}`);
} catch (error) {
log(error);
}
}
Результат
Информация о созданных ключах будет выведена ниже (или строка ошибки, если браузер не разрешает создание ключа).
Спецификации
Совместимость с браузерами
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
generateKey |
37 | 7912–79["Не поддерживается: RSA-PSS, ECDSA, ECDH.", "Не поддерживается: AES-CTR."] |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
ed25519 |
113 | 113 | 129 | 99 | 17 | 113 | 129 | Нет | 17 | Нет | Нет |
x25519 |
133 | 133 | 130 | Нет | 17 | 133 | 130 | Нет | 17 | Нет | 133 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey