SubtleCrypto.generateKey()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

安全上下文: 此项功能仅在一些支持的浏览器安全上下文(HTTPS)中可用。

SubtleCrypto 接口的 generateKey() 方法用于生成新的密钥(用于对称加密算法)或密钥对(用于非对称加密算法)。

语法

js
generateKey(algorithm, extractable, keyUsages)

参数

algorithm

一个对象,用于定义要生成的算法类型,并提供所需的参数。

extractable

一个布尔值,表示生成的密钥是否可被 SubtleCrypto.exportKey()SubtleCrypto.wrapKey() 方法导出。

keyUsages

一个数组,表示生成出来的密钥可被用于做什么,数组元素可能的值有:

返回值

一个 Promise,会兑现为 CryptoKey(用于对称加密算法)或 CryptoKeyPair(用于非对称加密算法)。

异常

当发生以下几种异常时,promise 会被拒绝:

SyntaxError DOMException

当结果是类型为 secretprivate加密密钥,但 keyUsages 参数为空时触发。

SyntaxError DOMException

当结果是加密密钥对,但它的 privateKey.usages 属性为空时触发。

示例

备注: 你可以在 Github 上尝试可用的示例

生成 RSA 密钥对

以下代码生成 RSA-OAEP 加密密钥对。在 GitHub 上查看完整代码。

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

js
let keyPair = await window.crypto.subtle.generateKey(
  {
    name: "ECDSA",
    namedCurve: "P-384",
  },
  true,
  ["sign", "verify"],
);

生成 HMAC 密钥

以下代码生成 HMAC 签名密钥。在 GitHub 上查看完整代码。

js
let key = await window.crypto.subtle.generateKey(
  {
    name: "HMAC",
    hash: { name: "SHA-512" },
  },
  true,
  ["sign", "verify"],
);

生成 AES 密钥

以下代码生成 AES-GCM 加密密钥。在 GitHub 上查看完整代码。

js
let key = await window.crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256,
  },
  true,
  ["encrypt", "decrypt"],
);

规范

Specification
Web Cryptography API
# SubtleCrypto-method-generateKey

浏览器兼容性

BCD tables only load in the browser

参见