Spec-Zone.ru › Web APIs

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, содержащего ключ.

Исключения

Промис отклоняется при возникновении одного из следующих исключений:

InvalidAccessError DOMException

Возникает при попытке экспорта неэкспортируемого ключа.

NotSupported DOMException

Возникает при попытке экспорта в неизвестном формате.

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 79
12–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

См. также

  • SubtleCrypto.importKey()
  • SubtleCrypto.wrapKey()
  • Формат PKCS #8.
  • Формат SubjectPublicKeyInfo.
  • Формат JSON Web Key.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API