SubtleCrypto: метод exportKey()
Базовая поддержка Широко доступна *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS), в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод exportKey() интерфейса SubtleCrypto экспортирует ключ: то есть, он принимает в качестве входного значения объект CryptoKey и возвращает ключ во внешнем, переносимом формате.
Для экспорта ключа свойство CryptoKey.extractable ключа должно быть установлено в значение true.
Ключи могут быть экспортированы в нескольких форматах: подробности см. в разделе Поддерживаемые форматы на странице SubtleCrypto.importKey().
Ключи не экспортируются в зашифрованном формате: для шифрования ключей при экспорте используйте API SubtleCrypto.wrapKey() вместо этого.
Синтаксис
exportKey(format, key)
Параметры
format-
Строковое значение, описывающее формат данных, в котором должен быть экспортирован ключ. Оно может быть одним из следующих:
-
raw: формат «сырой». -
pkcs8: формат PKCS #8. -
spki: формат SubjectPublicKeyInfo. -
jwk: формат JSON Web Key.
-
key-
Экспортируемый
CryptoKey.
Возвращаемое значение
Объект Promise.
- Если
formatбылоjwk, то промис выполнится со значением JSON-объекта, содержащего ключ. - В противном случае промис выполнится со значением
ArrayBuffer, содержащего ключ.
Исключения
Промис отклоняется при возникновении одного из следующих исключений:
-
InvalidAccessErrorDOMException -
Возникает при попытке экспорта неэкспортируемого ключа.
-
NotSupportedDOMException -
Возникает при попытке экспорта в неизвестном формате.
TypeError-
Возникает при использовании недопустимого формата.
Примеры
Примечание: Вы можете попробовать рабочие примеры на GitHub.
Экспорт в сыром формате
В этом примере ключ AES экспортируется как ArrayBuffer, содержащий байты ключа. См. весь код на GitHub.
/*
Export the given key and write it into the "exported-key" space.
*/
async function exportCryptoKey(key) {
const exported = await window.crypto.subtle.exportKey("raw", key);
const exportedKeyBuffer = new Uint8Array(exported);
const exportKeyOutput = document.querySelector(".exported-key");
exportKeyOutput.textContent = `[${exportedKeyBuffer}]`;
}
/*
Generate an encrypt/decrypt secret key,
then set up an event listener on the "Export" button.
*/
window.crypto.subtle
.generateKey(
{
name: "AES-GCM",
length: 256,
},
true,
["encrypt", "decrypt"],
)
.then((key) => {
const exportButton = document.querySelector(".raw");
exportButton.addEventListener("click", () => {
exportCryptoKey(key);
});
});
Экспорт в формате PKCS #8
В этом примере закрытый подписывающий ключ RSA экспортируется как объект PKCS #8. Экспортированный ключ затем кодируется в формате PEM. См. весь код на GitHub.
/*
Convert an ArrayBuffer into a string
from https://developer.chrome.com/blog/how-to-convert-arraybuffer-to-and-from-string/
*/
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
/*
Export the given key and write it into the "exported-key" space.
*/
async function exportCryptoKey(key) {
const exported = await window.crypto.subtle.exportKey("pkcs8", key);
const exportedAsString = ab2str(exported);
const exportedAsBase64 = window.btoa(exportedAsString);
const pemExported = `-----BEGIN PRIVATE KEY-----\n${exportedAsBase64}\n-----END PRIVATE KEY-----`;
const exportKeyOutput = document.querySelector(".exported-key");
exportKeyOutput.textContent = pemExported;
}
/*
Generate a sign/verify key pair,
then set up an event listener on the "Export" button.
*/
window.crypto.subtle
.generateKey(
{
name: "RSA-PSS",
// Consider using a 4096-bit key for systems that require long-term security
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["sign", "verify"],
)
.then((keyPair) => {
const exportButton = document.querySelector(".pkcs8");
exportButton.addEventListener("click", () => {
exportCryptoKey(keyPair.privateKey);
});
});
Экспорт в формате SubjectPublicKeyInfo
В этом примере открытый шифрующий ключ RSA экспортируется как объект SubjectPublicKeyInfo в формате PEM. См. весь код на GitHub.
/*
Convert an ArrayBuffer into a string
from https://developer.chrome.com/blog/how-to-convert-arraybuffer-to-and-from-string/
*/
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
/*
Export the given key and write it into the "exported-key" space.
*/
async function exportCryptoKey(key) {
const exported = await window.crypto.subtle.exportKey("spki", key);
const exportedAsString = ab2str(exported);
const exportedAsBase64 = window.btoa(exportedAsString);
const pemExported = `-----BEGIN PUBLIC KEY-----\n${exportedAsBase64}\n-----END PUBLIC KEY-----`;
const exportKeyOutput = document.querySelector(".exported-key");
exportKeyOutput.textContent = pemExported;
}
/*
Generate an encrypt/decrypt key pair,
then set up an event listener on the "Export" button.
*/
window.crypto.subtle
.generateKey(
{
name: "RSA-OAEP",
// Consider using a 4096-bit key for systems that require long-term security
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["encrypt", "decrypt"],
)
.then((keyPair) => {
const exportButton = document.querySelector(".spki");
exportButton.addEventListener("click", () => {
exportCryptoKey(keyPair.publicKey);
});
});
Экспорт в формате JSON Web Key
В этом примере закрытый подписывающий ключ ECDSA экспортируется как объект JSON Web Key. См. весь код на GitHub.
/*
Export the given key and write it into the "exported-key" space.
*/
async function exportCryptoKey(key) {
const exported = await window.crypto.subtle.exportKey("jwk", key);
const exportKeyOutput = document.querySelector(".exported-key");
exportKeyOutput.textContent = JSON.stringify(exported, null, " ");
}
/*
Generate a sign/verify key pair,
then set up an event listener on the "Export" button.
*/
window.crypto.subtle
.generateKey(
{
name: "ECDSA",
namedCurve: "P-384",
},
true,
["sign", "verify"],
)
.then((keyPair) => {
const exportButton = document.querySelector(".jwk");
exportButton.addEventListener("click", () => {
exportCryptoKey(keyPair.privateKey);
});
});
Спецификации
| Спецификация |
|---|
| API криптографии веб # SubtleCrypto-method-exportKey |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
exportKey |
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/exportKey