SubtleCrypto

Baseline 廣泛可用 *

此功能已成熟,可跨多種裝置和瀏覽器版本使用。自 2017 年 9 月以來,它已在瀏覽器中提供。

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

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

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

Web Crypto API 的 SubtleCrypto 介面提供了許多低階加密功能。

該介面名稱包含“subtle”(細微)一詞,表示其許多演算法都有細微的使用要求,因此必須謹慎使用才能提供適當的安全保證。

SubtleCrypto 的一個例項可以透過 Crypto 介面的 subtle 屬性獲得,該屬性又可以透過 Window.crypto 屬性在視窗中獲得,或透過 WorkerGlobalScope.crypto 屬性在 worker 中獲得。

警告:此 API 提供了一些低階加密原語。很容易誤用它們,並且其中的陷阱可能非常微妙。

即使您正確使用了基本的加密函式,安全的金鑰管理和整體安全系統設計也極難正確實現,通常是專業安全專家的領域。

安全系統設計和實現的錯誤可能導致系統安全性完全無效。

請學習和實驗,但在對該主題有深入瞭解的個人徹底審查之前,不要保證或暗示您的工作是安全的。 Crypto 101 課程是開始學習安全系統設計和實現的一個很好的起點。

例項屬性

此介面不繼承任何屬性,因為它沒有父介面。

例項方法

此介面不繼承任何方法,因為它沒有父介面。

SubtleCrypto.encrypt()

返回一個 Promise,該 Promise 以引數中給定的明文、演算法和金鑰對應的加密資料進行解析。

SubtleCrypto.decrypt()

返回一個 Promise,該 Promise 以引數中給定的加密文字、演算法和金鑰對應的明文資料進行解析。

SubtleCrypto.sign()

返回一個 Promise,該 Promise 以引數中給定的文字、演算法和金鑰對應的簽名進行解析。

SubtleCrypto.verify()

返回一個 Promise,該 Promise 以一個布林值進行解析,該值指示引數中給定的簽名是否與同樣作為引數給出的文字、演算法和金鑰匹配。

SubtleCrypto.digest()

返回一個 Promise,該 Promise 以引數中給定的演算法和文字生成的摘要進行解析。

SubtleCrypto.generateKey()

返回一個 Promise,該 Promise 以一個新生成的 CryptoKey(對於對稱演算法)或一個包含兩個新生成的金鑰的 CryptoKeyPair(對於非對稱演算法)進行解析。這些將與引數中給定的演算法、用法和可提取性相匹配。

SubtleCrypto.deriveKey()

返回一個 Promise,該 Promise 以從主金鑰和引數中給定的特定演算法派生出的新生成的 CryptoKey 進行解析。

SubtleCrypto.deriveBits()

返回一個 Promise,該 Promise 以從主金鑰和引數中給定的特定演算法派生出的新生成的偽隨機位元緩衝區進行解析。

SubtleCrypto.importKey()

返回一個 Promise,該 Promise 以與引數中給定的格式、演算法、原始金鑰資料、用法和可提取性相對應的 CryptoKey 進行解析。

SubtleCrypto.exportKey()

返回一個 Promise,該 Promise 以包含請求格式的金鑰的原始金鑰資料進行解析。

SubtleCrypto.wrapKey()

返回一個 Promise,該 Promise 以一個用於在不安全環境中使用(傳輸和儲存)的封裝對稱金鑰進行解析。封裝的金鑰與給定引數中指定的格式匹配,並且使用指定的演算法,由給定的封裝金鑰進行封裝。

SubtleCrypto.unwrapKey()

返回一個 Promise,該 Promise 以與引數中給定的封裝金鑰相對應的 CryptoKey 進行解析。

使用 SubtleCrypto

我們可以將此 API 實現的功能分為兩類:加密功能和金鑰管理功能。

加密功能

這些是您可以在系統中用於實現隱私和身份驗證等安全功能的函式。 SubtleCrypto API 提供以下加密功能:

金鑰管理功能

除了 digest() 之外,API 中的所有加密函式都使用加密金鑰。在 SubtleCrypto API 中,加密金鑰使用 CryptoKey 物件表示。要執行簽名和加密等操作,您需要將 CryptoKey 物件傳遞給 sign()encrypt() 函式。

生成和派生金鑰

generateKey()deriveKey() 函式都建立一個新的 CryptoKey 物件。

區別在於,generateKey() 每次呼叫時都會生成一個新的、不同的金鑰值,而 deriveKey() 則從某個初始金鑰材料派生金鑰。如果您將相同的金鑰材料提供給兩次單獨呼叫 deriveKey(),您將獲得兩個具有相同底層值的 CryptoKey 物件。這很有用,例如,當您想從密碼派生一個加密金鑰,然後稍後從相同的密碼派生相同的金鑰來解密資料時。

匯入和匯出金鑰

為了使金鑰在您的應用程式外部可用,您需要匯出金鑰,這就是 exportKey() 的用途。您可以選擇多種匯出格式之一。

exportKey() 的反向操作是 importKey()。您可以從其他系統匯入金鑰,並且支援 PKCS #8JSON Web Key 等標準格式,這有助於您完成此操作。 exportKey() 函式以未加密的格式匯出金鑰。

如果金鑰是敏感的,您應該使用 wrapKey(),它會匯出金鑰,然後使用另一個金鑰對其進行加密;API 稱之為“金鑰封裝金鑰”。

wrapKey() 的反向操作是 unwrapKey(),它會解密然後匯入金鑰。

儲存金鑰

CryptoKey 是一個 可序列化物件,它允許使用標準的 Web 儲存 API 來儲存和檢索金鑰。

該規範期望大多數開發人員將使用 IndexedDB API,將 CryptoKey 物件儲存在應用程式有意義的某個金鑰字串識別符號下,以及任何其他他們認為有用的元資料。這允許在不向應用程式或 JavaScript 環境暴露其底層金鑰材料的情況下儲存和檢索 CryptoKey

支援的演算法

Web Crypto API 提供的加密功能可以由一個或多個不同的加密演算法執行:函式的 algorithm 引數指示要使用的演算法。某些演算法需要額外的引數:在這種情況下,algorithm 引數是一個字典物件,其中包含額外的引數。

下表總結了哪些演算法適用於哪些加密操作

符號
verify
encrypt
decrypt
digest deriveBits
deriveKey
wrapKey
unwrapKey
generateKey
exportKey
importKey
RSASSA-PKCS1-v1_5
RSA-PSS
ECDSA
Ed25519
HMAC
RSA-OAEP
AES-CTR
AES-CBC
AES-GCM
AES-KW
SHA-1
SHA-256
SHA-384
SHA-512
ECDH
X25519
HKDF
PBKDF2

規範

規範
Web 加密級別 2
# subtlecrypto-interface

瀏覽器相容性

另見