SubtleCrypto: generateKey() 方法
Baseline 廣泛可用 *
注意:此功能在 Web Workers 中可用。
SubtleCrypto 介面的 generateKey() 方法用於生成一個新的金鑰(用於對稱演算法)或金鑰對(用於公鑰演算法)。
語法
generateKey(algorithm, extractable, keyUsages)
引數
algorithm-
一個定義要生成的金鑰型別並提供額外的演算法特定引數的物件。
- 對於 RSASSA-PKCS1-v1_5、RSA-PSS 或 RSA-OAEP:傳遞一個
RsaHashedKeyGenParams物件。 - 對於 ECDSA 或 ECDH:傳遞一個
EcKeyGenParams物件。 - 對於 HMAC:傳遞一個
HmacKeyGenParams物件。 - 對於 AES-CTR、AES-CBC、AES-GCM 或 AES-KW:傳遞一個
AesKeyGenParams物件。 - 對於 Ed25519:傳遞字串
Ed25519或形式為{ name: "Ed25519" }的物件。 - 對於 X25519:傳遞字串
X25519或形式為{ name: "X25519" }的物件。
- 對於 RSASSA-PKCS1-v1_5、RSA-PSS 或 RSA-OAEP:傳遞一個
extractable-
一個布林值,指示是否可以使用
SubtleCrypto.exportKey()或SubtleCrypto.wrapKey()匯出金鑰。 keyUsages-
一個
Array,其中包含指示新生成的金鑰可以執行的操作的字串。陣列元素的可能值為
返回值
一個 Promise,它將以 CryptoKey(用於對稱演算法)或 CryptoKeyPair(用於公鑰演算法)進行解析。
異常
當遇到以下異常時,Promise 將被拒絕
SyntaxErrorDOMException-
當結果是型別為
secret或private的CryptoKey,但keyUsages為空或對於演算法型別無效時,將丟擲此異常。 SyntaxErrorDOMException-
當結果是
CryptoKeyPair且其privateKey.usages屬性為空或對於演算法型別無效時,將丟擲此異常。
示例
注意:您可以在 GitHub 上 嘗試工作示例。
RSA 金鑰對生成
此程式碼生成一個 RSA-OAEP 加密金鑰對。 在 GitHub 上檢視完整程式碼。
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 上檢視完整程式碼。
let keyPair = await window.crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-384",
},
true,
["sign", "verify"],
);
HMAC 金鑰生成
此程式碼生成一個 HMAC 簽名金鑰。 在 GitHub 上檢視完整程式碼。
let key = await window.crypto.subtle.generateKey(
{
name: "HMAC",
hash: { name: "SHA-512" },
},
true,
["sign", "verify"],
);
AES 金鑰生成
此程式碼生成一個 AES-GCM 加密金鑰。 在 GitHub 上檢視完整程式碼。
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> 元素的內容。
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 金鑰對,並記錄其一些屬性。
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 |
瀏覽器相容性
載入中…