SubtleCrypto: generateKey() 方法

Baseline 廣泛可用 *

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流瀏覽器均已支援。

* 此特性的某些部分可能存在不同級別的支援。

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

注意:此功能在 Web Workers 中可用。

SubtleCrypto 介面的 generateKey() 方法用於生成一個新的金鑰(用於對稱演算法)或金鑰對(用於公鑰演算法)。

語法

js
generateKey(algorithm, extractable, keyUsages)

引數

algorithm

一個定義要生成的金鑰型別並提供額外的演算法特定引數的物件。

extractable

一個布林值,指示是否可以使用 SubtleCrypto.exportKey()SubtleCrypto.wrapKey() 匯出金鑰。

keyUsages

一個 Array,其中包含指示新生成的金鑰可以執行的操作的字串。陣列元素的可能值為

encrypt

金鑰可用於 加密訊息。

decrypt

金鑰可用於 解密訊息。

符號

金鑰可用於 簽名訊息。

verify

金鑰可用於 驗證簽名。

deriveKey

金鑰可用於 派生新金鑰

deriveBits

金鑰可用於 派生位

wrapKey

金鑰可用於 包裝金鑰

unwrapKey

金鑰可用於 解包裝金鑰

返回值

一個 Promise,它將以 CryptoKey(用於對稱演算法)或 CryptoKeyPair(用於公鑰演算法)進行解析。

異常

當遇到以下異常時,Promise 將被拒絕

SyntaxError DOMException

當結果是型別為 secretprivateCryptoKey,但 keyUsages 為空或對於演算法型別無效時,將丟擲此異常。

SyntaxError DOMException

當結果是 CryptoKeyPair 且其 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"],
);

Ed25519 金鑰生成

此程式碼生成一個 Ed25519 簽名金鑰對。它源自 GitHub 上的此原始碼,您可以在 此處即時執行

JavaScript

下面顯示了使用 Ed25519 演算法生成金鑰對並記錄每個金鑰資訊的程式碼。請注意,程式碼執行在 try..catch 塊中,因為並非所有瀏覽器都支援此演算法。

JavaScript 首先獲取 #sign-button#message <input> 元素,然後為按鈕的 click 事件新增一個監聽器。事件處理程式會清除日誌並執行其他操作,傳遞 <input> 元素的內容。

js
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 金鑰對,並記錄其一些屬性。

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

結果

有關建立的金鑰的資訊將記錄在下方(如果瀏覽器不允許建立金鑰,則顯示錯誤字串)。

規範

規範
Web 加密級別 2
# SubtleCrypto-method-generateKey

瀏覽器相容性

另見