SubtleCrypto:exportKey() 方法

基线 广泛可用

此功能已得到良好建立,可在许多设备和浏览器版本上运行。自以下时间起,它已在浏览器中可用 2015年7月.

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在部分或所有支持的浏览器中。

SubtleCrypto接口的exportKey()方法导出密钥:即,它以CryptoKey对象作为输入,并以外部、可移植的格式提供密钥。

要导出密钥,密钥必须将CryptoKey.extractable设置为true

密钥可以以多种格式导出:有关详细信息,请参阅SubtleCrypto.importKey()页面中的支持的格式

密钥不会以加密格式导出:要在导出密钥时加密密钥,请改用SubtleCrypto.wrapKey() API。

语法

js
exportKey(format, key)

参数

format

一个字符串值,描述应以何种数据格式导出密钥。它可以是以下之一

key

要导出的CryptoKey

返回值

一个Promise

  • 如果formatjwk,则 promise 将以包含密钥的 JSON 对象完成。
  • 否则,promise 将以包含密钥的ArrayBuffer完成。

异常

当遇到以下异常之一时,promise 将被拒绝

InvalidAccessError DOMException

尝试导出不可提取的密钥时引发。

NotSupported DOMException

尝试以未知格式导出时引发。

TypeError

尝试使用无效格式时引发。

示例

注意:您可以在 GitHub 上尝试运行示例

原始导出

此示例将 AES 密钥导出为包含密钥字节的ArrayBuffer在 GitHub 上查看完整代码

js
/*
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 上查看完整代码

js
/*
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 公钥加密密钥导出为 PEM 编码的 SubjectPublicKeyInfo 对象。在 GitHub 上查看完整代码

js
/*
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 上查看完整代码

js
/*
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);
    });
  });

规范

规范
Web 密码学 API
# SubtleCrypto-method-exportKey

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅