- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲(Buffer)
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入 Node环境
- 子进程(Child processes)
- 集群(Cluster)
- 命令行选项
- 控制台(Console)
- 核心包(Corepack)
- 加密(Crypto)
- 调试器(Debugger)
- 已弃用的 API
- 诊断通道(Diagnostics Channel)
- 域名系统(DNS)
- 域(Domain)
- 错误(Errors)
- 事件(Events)
- 文件系统(File system)
- 全局变量(Globals)
- HTTP
- HTTP/2
- HTTPS
- 检查器(Inspector)
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:packages 模块
- 网络(Net)
- 系统(OS)
- 路径(Path)
- 性能挂钩(Performance hooks)
- 性能挂钩(Permissions)
- 进程(Process)
- Punycode 国际化域名编码
- 查询字符串(Query strings)
- 命令行库(Readline)
- REPL 交互式编程环境
- 诊断报告
- 单个可执行应用程序
- Stream 流
- 字符串解码器
- 单元测试
- 定时器(Timers)
- 传输层安全/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用程序
- V8
- 虚拟机
- WebAssembly
- Web加密 API(Web Crypto API)
- 网络流 API(Web Streams API)
- 工作线程(Worker threads)
- zlib
Node.js v18.18.2 文档
- Node.js v18.18.2
-
►
目录
- WEB加密 API
- 例子
- 算法矩阵
- 类:
Crypto
- 类:
CryptoKey
- 类:
CryptoKeyPair
- 类:
SubtleCrypto
subtle.decrypt(algorithm, key, data)
subtle.deriveBits(algorithm, baseKey, length)
subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)
subtle.digest(algorithm, data)
subtle.encrypt(algorithm, key, data)
subtle.exportKey(format, key)
subtle.generateKey(algorithm, extractable, keyUsages)
subtle.importKey(format, keyData, algorithm, extractable, keyUsages)
subtle.sign(algorithm, key, data)
subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgo, unwrappedKeyAlgo, extractable, keyUsages)
subtle.verify(algorithm, key, signature, data)
subtle.wrapKey(format, key, wrappingKey, wrapAlgo)
- 算法参数
- 类:
AlgorithmIdentifier
- 类:
AesCbcParams
- 类:
AesCtrParams
- 类:
AesGcmParams
- 类:
AesKeyGenParams
- 类:
EcdhKeyDeriveParams
- 类:
EcdsaParams
- 类:
EcKeyGenParams
- 类:
EcKeyImportParams
- 类:
Ed448Params
- 类:
HkdfParams
- 类:
HmacImportParams
- 类:
HmacKeyGenParams
- 类:
Pbkdf2Params
- 类:
RsaHashedImportParams
- 类:
RsaHashedKeyGenParams
- 类:
RsaOaepParams
- 类:
RsaPssParams
- 类:
- WEB加密 API
-
►
索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲(Buffer)
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ embedder API
- Child processes
- Cluster
- Command-line options
- Console
- Corepack
- Crypto
- Debugger
- Deprecated APIs
- Diagnostics Channel
- DNS
- Domain
- Errors
- Events
- File system
- Globals
- HTTP
- HTTP/2
- HTTPS
- Inspector
- Internationalization
- Modules: CommonJS modules
- Modules: ECMAScript modules
- Modules:
node:module
API - Modules: Packages
- Net
- 系统(OS)
- 路径(Path)
- Performance hooks
- Permissions
- 进程(Process)
- Punycode
- Query strings
- 命令行库(Readline)
- REPL 交互式编程环境
- Report
- Single executable applications
- Stream
- String decoder
- Test runner
- Timers
- TLS/SSL
- Trace events
- TTY
- UDP/datagram
- URL
- Utilities
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- Worker threads
- Zlib
- ► 其他版本
- ► 选项
目录
- WEB加密 API
- 例子
- 算法矩阵
- 类:
Crypto
- 类:
CryptoKey
- 类:
CryptoKeyPair
- 类:
SubtleCrypto
subtle.decrypt(algorithm, key, data)
subtle.deriveBits(algorithm, baseKey, length)
subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)
subtle.digest(algorithm, data)
subtle.encrypt(algorithm, key, data)
subtle.exportKey(format, key)
subtle.generateKey(algorithm, extractable, keyUsages)
subtle.importKey(format, keyData, algorithm, extractable, keyUsages)
subtle.sign(algorithm, key, data)
subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgo, unwrappedKeyAlgo, extractable, keyUsages)
subtle.verify(algorithm, key, signature, data)
subtle.wrapKey(format, key, wrappingKey, wrapAlgo)
- 算法参数
- 类:
AlgorithmIdentifier
- 类:
AesCbcParams
- 类:
AesCtrParams
- 类:
AesGcmParams
- 类:
AesKeyGenParams
- 类:
EcdhKeyDeriveParams
- 类:
EcdsaParams
- 类:
EcKeyGenParams
- 类:
EcKeyImportParams
- 类:
Ed448Params
- 类:
HkdfParams
- 类:
HmacImportParams
- 类:
HmacKeyGenParams
- 类:
Pbkdf2Params
- 类:
RsaHashedImportParams
- 类:
RsaHashedKeyGenParams
- 类:
RsaOaepParams
- 类:
RsaPssParams
- 类:
WEB加密 API#
Node.js 提供了标准Web Crypto API的实现。
使用require('node:crypto').webcrypto
访问此模块。
const { subtle } = require('node:crypto').webcrypto;
(async function() {
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256,
}, true, ['sign', 'verify']);
const enc = new TextEncoder();
const message = enc.encode('I love cupcakes');
const digest = await subtle.sign({
name: 'HMAC',
}, key, message);
})();
例子#
生成密钥#
<SubtleCrypto>类可用于生成对称(秘密)密钥或非对称密钥对(公钥和私钥)。
AES 密钥#
const { subtle } = require('node:crypto').webcrypto;
async function generateAesKey(length = 256) {
const key = await subtle.generateKey({
name: 'AES-CBC',
length,
}, true, ['encrypt', 'decrypt']);
return key;
}
ECDSA 密钥对#
const { subtle } = require('node:crypto').webcrypto;
async function generateEcKey(namedCurve = 'P-521') {
const {
publicKey,
privateKey,
} = await subtle.generateKey({
name: 'ECDSA',
namedCurve,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
}
Ed25519/Ed448/X25519/X448 密钥对#
const { subtle } = require('node:crypto').webcrypto;
async function generateEd25519Key() {
return subtle.generateKey({
name: 'Ed25519',
}, true, ['sign', 'verify']);
}
async function generateX25519Key() {
return subtle.generateKey({
name: 'X25519',
}, true, ['deriveKey']);
}
HMAC 密钥#
const { subtle } = require('node:crypto').webcrypto;
async function generateHmacKey(hash = 'SHA-256') {
const key = await subtle.generateKey({
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return key;
}
RSA 密钥对#
const { subtle } = require('node:crypto').webcrypto;
const publicExponent = new Uint8Array([1, 0, 1]);
async function generateRsaKey(modulusLength = 2048, hash = 'SHA-256') {
const {
publicKey,
privateKey,
} = await subtle.generateKey({
name: 'RSASSA-PKCS1-v1_5',
modulusLength,
publicExponent,
hash,
}, true, ['sign', 'verify']);
return { publicKey, privateKey };
}
加密与解密#
const crypto = require('node:crypto').webcrypto;
async function aesEncrypt(plaintext) {
const ec = new TextEncoder();
const key = await generateAesKey();
const iv = crypto.getRandomValues(new Uint8Array(16));
const ciphertext = await crypto.subtle.encrypt({
name: 'AES-CBC',
iv,
}, key, ec.encode(plaintext));
return {
key,
iv,
ciphertext,
};
}
async function aesDecrypt(ciphertext, key, iv) {
const dec = new TextDecoder();
const plaintext = await crypto.subtle.decrypt({
name: 'AES-CBC',
iv,
}, key, ciphertext);
return dec.decode(plaintext);
}
导出和导入密钥#
const { subtle } = require('node:crypto').webcrypto;
async function generateAndExportHmacKey(format = 'jwk', hash = 'SHA-512') {
const key = await subtle.generateKey({
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return subtle.exportKey(format, key);
}
async function importHmacKey(keyData, format = 'jwk', hash = 'SHA-512') {
const key = await subtle.importKey(format, keyData, {
name: 'HMAC',
hash,
}, true, ['sign', 'verify']);
return key;
}
包装和解开密钥#
const { subtle } = require('node:crypto').webcrypto;
async function generateAndWrapHmacKey(format = 'jwk', hash = 'SHA-512') {
const [
key,
wrappingKey,
] = await Promise.all([
subtle.generateKey({
name: 'HMAC', hash,
}, true, ['sign', 'verify']),
subtle.generateKey({
name: 'AES-KW',
length: 256,
}, true, ['wrapKey', 'unwrapKey']),
]);
const wrappedKey = await subtle.wrapKey(format, key, wrappingKey, 'AES-KW');
return { wrappedKey, wrappingKey };
}
async function unwrapHmacKey(
wrappedKey,
wrappingKey,
format = 'jwk',
hash = 'SHA-512') {
const key = await subtle.unwrapKey(
format,
wrappedKey,
wrappingKey,
'AES-KW',
{ name: 'HMAC', hash },
true,
['sign', 'verify']);
return key;
}
签名并验证#
const { subtle } = require('node:crypto').webcrypto;
async function sign(key, data) {
const ec = new TextEncoder();
const signature =
await subtle.sign('RSASSA-PKCS1-v1_5', key, ec.encode(data));
return signature;
}
async function verify(key, signature, data) {
const ec = new TextEncoder();
const verified =
await subtle.verify(
'RSASSA-PKCS1-v1_5',
key,
signature,
ec.encode(data));
return verified;
}
派生位和密钥#
const { subtle } = require('node:crypto').webcrypto;
async function pbkdf2(pass, salt, iterations = 1000, length = 256) {
const ec = new TextEncoder();
const key = await subtle.importKey(
'raw',
ec.encode(pass),
'PBKDF2',
false,
['deriveBits']);
const bits = await subtle.deriveBits({
name: 'PBKDF2',
hash: 'SHA-512',
salt: ec.encode(salt),
iterations,
}, key, length);
return bits;
}
async function pbkdf2Key(pass, salt, iterations = 1000, length = 256) {
const ec = new TextEncoder();
const keyMaterial = await subtle.importKey(
'raw',
ec.encode(pass),
'PBKDF2',
false,
['deriveKey']);
const key = await subtle.deriveKey({
name: 'PBKDF2',
hash: 'SHA-512',
salt: ec.encode(salt),
iterations,
}, keyMaterial, {
name: 'AES-GCM',
length: 256,
}, true, ['encrypt', 'decrypt']);
return key;
}
摘要#
const { subtle } = require('node:crypto').webcrypto;
async function digest(data, algorithm = 'SHA-512') {
const ec = new TextEncoder();
const digest = await subtle.digest(algorithm, ec.encode(data));
return digest;
}
算法矩阵#
该表详细介绍了 Node.js Web Crypto API 实现支持的算法以及每个算法支持的 API:
算法 | generateKey | exportKey | importKey | encrypt | decrypt | wrapKey | unwrapKey | deriveBits | deriveKey | sign | verify | digest |
---|---|---|---|---|---|---|---|---|---|---|---|---|
'RSASSA-PKCS1-v1_5' | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'RSA-PSS' | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'RSA-OAEP' | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'ECDSA' | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'Ed25519' 1 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'Ed448' 1 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'ECDH' | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'X25519' 1 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'X448' 1 | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'AES-CTR' | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-CBC' | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-GCM' | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |||||
'AES-KW' | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'HMAC' | ✔ | ✔ | ✔ | ✔ | ✔ | |||||||
'HKDF' | ✔ | ✔ | ✔ | ✔ | ||||||||
'PBKDF2' | ✔ | ✔ | ✔ | ✔ | ||||||||
'SHA-1' | ✔ | |||||||||||
'SHA-256' | ✔ | |||||||||||
'SHA-384' | ✔ | |||||||||||
'SHA-512' | ✔ |
类:Crypto
#
调用require('node:crypto').webcrypto
返回Crypto
类的实例
。Crypto
是一个单例,提供对加密 API 其余部分的访问。
crypto.subtle
#
- 类型:<微妙加密>
提供对SubtleCrypto
API的访问。
crypto.getRandomValues(typedArray)
#
生成加密的强随机值。给定的typedArray
用随机值填充,并返回对typedArray
的引用。
给定的typedArray
必须是<TypedArray>基于整数的实例,即不接受Float32Array
和Float64Array
。
如果给定的typedArray
大于 65,536 字节,则会抛出错误。
crypto.randomUUID()
#
- 返回:<字符串>
生成随机RFC 4122版本 4 UUID。UUID 是使用加密伪随机数生成器生成的。
类:CryptoKey
#
cryptoKey.algorithm
#
详细说明算法的对象,可以将密钥与其他特定于算法的参数一起使用。
只读。
cryptoKey.extractable
#
- 类型:<布尔值>
当true
时,可以使用
subtleCrypto.exportKey()
或subtleCrypto.wrapKey()
提取<CryptoKey>。
只读。
cryptoKey.type
#
- 类型:<string>
'secret'
、'private'
或'public'
之一。
一个字符串,用于标识密钥是对称密钥 ( 'secret'
) 还是非对称密钥 ( 'private'
或'public'
)。
cryptoKey.usages
#
- 类型:<字符串[]>
标识可以使用该密钥的操作的字符串数组。
可能的用途是:
'encrypt'
- 密钥可用于加密数据。'decrypt'
- 密钥可用于解密数据。'sign'
- 该密钥可用于生成数字签名。'verify'
- 密钥可用于验证数字签名。'deriveKey'
- 该密钥可用于派生新密钥。'deriveBits'
- 密钥可用于导出位。'wrapKey'
- 该密钥可用于包装另一个密钥。'unwrapKey'
- 该密钥可用于解开另一个密钥。
有效的密钥用法取决于密钥算法(由
cryptokey.algorithm.name
标识)。
钥匙类型 | 'encrypt' | 'decrypt' | 'sign' | 'verify' | 'deriveKey' | 'deriveBits' | 'wrapKey' | 'unwrapKey' |
---|---|---|---|---|---|---|---|---|
'AES-CBC' | ✔ | ✔ | ✔ | ✔ | ||||
'AES-CTR' | ✔ | ✔ | ✔ | ✔ | ||||
'AES-GCM' | ✔ | ✔ | ✔ | ✔ | ||||
'AES-KW' | ✔ | ✔ | ||||||
'ECDH' | ✔ | ✔ | ||||||
'X25519' 1 | ✔ | ✔ | ||||||
'X448' 1 | ✔ | ✔ | ||||||
'ECDSA' | ✔ | ✔ | ||||||
'Ed25519' 1 | ✔ | ✔ | ||||||
'Ed448' 1 | ✔ | ✔ | ||||||
'HDKF' | ✔ | ✔ | ||||||
'HMAC' | ✔ | ✔ | ||||||
'PBKDF2' | ✔ | ✔ | ||||||
'RSA-OAEP' | ✔ | ✔ | ✔ | ✔ | ||||
'RSA-PSS' | ✔ | ✔ | ||||||
'RSASSA-PKCS1-v1_5' | ✔ | ✔ |
类:CryptoKeyPair
#
CryptoKeyPair
是一个简单的字典对象,具有publicKey
和
privateKey
属性,表示非对称密钥对。
cryptoKeyPair.privateKey
#
- 类型:<CryptoKey>一个<CryptoKey>,其
type
将为'private'
。
cryptoKeyPair.publicKey
#
- 类型:<CryptoKey>一个<CryptoKey>,其
type
将为'public'
。
类:SubtleCrypto
#
subtle.decrypt(algorithm, key, data)
#
algorithm
: <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcm参数>key
: <加密密钥>data
: <ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>- 返回:包含<ArrayBuffer>的<Promise>
使用algorithm
中指定的方法和参数以及key
提供的密钥材料,subtle.decrypt()
尝试解密提供的data
。如果成功,返回的 Promise 将使用包含明文结果的<ArrayBuffer>进行解析。
目前支持的算法包括:
'RSA-OAEP'
'AES-CTR'
'AES-CBC'
'AES-GCM
'
subtle.deriveBits(algorithm, baseKey, length)
#
algorithm
: <算法标识符> | <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2参数>baseKey
: <加密密钥>length
: <数字> | <空>- 返回:包含<ArrayBuffer>的<Promise>
使用algorithm
中指定的方法和参数以及baseKey
提供的密钥材料,subtle.deriveBits()
尝试生成
length
位。
Node.js 实现要求,当length
是数字时,它必须是8
的倍数。
当length
为null
时,将生成给定算法的最大位数。这对于'ECDH'
、'X25519'
和'X448'
算法是允许的
。
如果成功,返回的 Promise 将使用 包含生成数据的<ArrayBuffer>进行解析。
目前支持的算法包括:
subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)
#
algorithm
: <算法标识符> | <EcdhKeyDeriveParams> | <HkdfParams> | <Pbkdf2参数>baseKey
: <加密密钥>derivedKeyAlgorithm
: <HmacKeyGenParams> | <AesKeyGenParams>extractable
: <布尔值>keyUsages
: <string[]>请参阅关键用法。- 返回:包含<CryptoKey>的<Promise>
使用algorithm
中指定的方法和参数以及baseKey
提供的密钥材料,subtle.deriveKey()
尝试根据该方法和参数生成新的<CryptoKey>在derivedKeyAlgorithm
中。
调用subtle.deriveKey()
相当于调用subtle.deriveBits()
生成原始密钥材料,然后使用 deriveKeyAlgorithm
将结果传递到
subtle.importKey()
方法,extractable
和
keyUsages
参数作为输入。
目前支持的算法包括:
subtle.digest(algorithm, data)
#
algorithm
: <字符串> | <对象>data
: <ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>- 返回:包含<ArrayBuffer>的<Promise>
使用algorithm
标识的方法,subtle.digest()
尝试生成data
的摘要。如果成功,返回的 Promise 将使用包含计算摘要的<ArrayBuffer>进行解析。
如果algorithm
作为<string>提供,则它必须是以下之一:
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
如果algorithm
作为<Object>提供,则它必须具有一个name
属性,其值为上述之一。
subtle.encrypt(algorithm, key, data)
#
algorithm
: <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcm参数>key
: <加密密钥>- 返回:包含<ArrayBuffer>的<Promise>
使用algorithm
指定的方法和参数以及key
提供的密钥材料,subtle.encrypt()
尝试加密data
。如果成功,返回的 Promise 将使用
包含加密结果的<ArrayBuffer>进行解析。
目前支持的算法包括:
'RSA-OAEP'
'AES-CTR'
'AES-CBC'
'AES-GCM
'
subtle.exportKey(format, key)
#
format
:<string>必须是'raw'
、'pkcs8'
、'spki'
或'jwk'
之一。key
: <加密密钥>- 返回:<Promise>包含<ArrayBuffer> | <对象>。
将给定密钥导出为指定格式(如果支持)。
如果<CryptoKey>不可提取,则返回的 Promise 将被拒绝。
当format
为'pkcs8'
或'spki'
且导出成功时,返回的 Promise 将使用包含导出的键数据的<ArrayBuffer>进行解析。
当format
为'jwk'
并且导出成功时,返回的 Promise 将使用符合JSON Web Key
规范的 JavaScript 对象进行解析。
钥匙类型 | 'spki' | 'pkcs8' | 'jwk' | 'raw' |
---|---|---|---|---|
'AES-CBC' | ✔ | ✔ | ||
'AES-CTR' | ✔ | ✔ | ||
'AES-GCM' | ✔ | ✔ | ||
'AES-KW' | ✔ | ✔ | ||
'ECDH' | ✔ | ✔ | ✔ | ✔ |
'ECDSA' | ✔ | ✔ | ✔ | ✔ |
'Ed25519' 1 | ✔ | ✔ | ✔ | ✔ |
'Ed448' 1 | ✔ | ✔ | ✔ | ✔ |
'HDKF' | ||||
'HMAC' | ✔ | ✔ | ||
'PBKDF2' | ||||
'RSA-OAEP' | ✔ | ✔ | ✔ | |
'RSA-PSS' | ✔ | ✔ | ✔ | |
'RSASSA-PKCS1-v1_5' | ✔ | ✔ | ✔ |
subtle.generateKey(algorithm, extractable, keyUsages)
#
algorithm
: <算法标识符> | <RsaHashedKeyGenParams> | <EcKeyGenParams> | <HmacKeyGenParams> | <AesKeyGenParams>
extractable
: <布尔值>keyUsages
: <string[]>请参阅关键用法。- 返回:<Promise>包含<CryptoKey> | <加密密钥对>
使用algorithm
中提供的方法和参数,subtle.generateKey()
尝试生成新的密钥材料。根据所使用的方法,该方法可能生成单个<CryptoKey>或<CryptoKeyPair>。
支持的 <CryptoKeyPair>(公钥和私钥)生成算法包括:
支持的<CryptoKey>(秘密密钥)生成算法包括:
'HMAC'
'AES-CTR'
'AES-CBC'
'AES-GCM'
'AES-KW'
subtle.importKey(format, keyData, algorithm, extractable, keyUsages)
#
format
:<string>必须是'raw'
、'pkcs8'
、'spki'
或'jwk'
之一。keyData
: <ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区> | <对象>
algorithm
: <算法标识符> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
extractable
: <布尔值>keyUsages
: <string[]>请参阅键用法。- 返回:包含<CryptoKey>的<Promise>
subtle.importKey()
方法尝试将提供的keyData
解释
为给定的format
,以使用提供的
algorithm
创建<CryptoKey>实例,extractable
和keyUsages
参数。如果导入成功,返回的 Promise 将使用创建的<CryptoKey>进行解析。
如果导入'PBKDF2'
键,则extractable
必须为false
。
目前支持的算法包括:
钥匙类型 | 'spki' | 'pkcs8' | 'jwk' | 'raw' |
---|---|---|---|---|
'AES-CBC' | ✔ | ✔ | ||
'AES-CTR' | ✔ | ✔ | ||
'AES-GCM' | ✔ | ✔ | ||
'AES-KW' | ✔ | ✔ | ||
'ECDH' | ✔ | ✔ | ✔ | ✔ |
'X25519' 1 | ✔ | ✔ | ✔ | ✔ |
'X448' 1 | ✔ | ✔ | ✔ | ✔ |
'ECDSA' | ✔ | ✔ | ✔ | ✔ |
'Ed25519' 1 | ✔ | ✔ | ✔ | ✔ |
'Ed448' 1 | ✔ | ✔ | ✔ | ✔ |
'HDKF' | ✔ | |||
'HMAC' | ✔ | ✔ | ||
'PBKDF2' | ✔ | |||
'RSA-OAEP' | ✔ | ✔ | ✔ | |
'RSA-PSS' | ✔ | ✔ | ✔ | |
'RSASSA-PKCS1-v1_5' | ✔ | ✔ | ✔ |
subtle.sign(algorithm, key, data)
#
algorithm
: <算法标识符> | <RsaPssParams> | <EcdsaParams> | <Ed448参数>key
: <加密密钥>data
: <ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>- 返回:包含<ArrayBuffer>的<Promise>
使用algorithm
给出的方法和参数以及key
提供的密钥材料,subtle.sign()
尝试生成data
的加密签名。如果成功,返回的 Promise 将使用包含生成签名的<ArrayBuffer>进行解析。
目前支持的算法包括:
subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgo, unwrappedKeyAlgo, extractable, keyUsages)
#
format
:<string>必须是'raw'
、'pkcs8'
、'spki'
或'jwk'
之一。wrappedKey
: <ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>unwrappingKey
: <加密密钥>
unwrapAlgo
: <算法标识符> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcm参数>unwrappedKeyAlgo
: <算法标识符> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
extractable
: <布尔值>keyUsages
: <string[]>请参阅关键用法。- 返回:包含<CryptoKey>的<Promise>
在密码学中,“包装密钥”是指导出然后加密密钥材料。subtle.unwrapKey()
方法尝试解密包装的密钥并创建<CryptoKey>实例。它相当于
首先对加密的密钥数据调用subtle.decrypt()
(使用wrappedKey
、
unwrapAlgo
和unwrappingKey
参数作为输入),然后使用unwrappedKeyAlgo
、
extractable
和keyUsages
参数作为输入将结果传递给subtle.importKey()
方法。如果成功,返回的 Promise 将通过<CryptoKey>对象解析。
目前支持的环绕算法包括:
'RSA-OAEP'
'AES-CTR'
'AES-CBC'
'AES-GCM'
'AES-KW'
支持的解包关键算法包括:
'RSASSA-PKCS1-v1_5'
'RSA-PSS'
'RSA-OAEP'
'ECDSA'
'Ed25519'
1'Ed448'
1'ECDH'
'X25519'
1'X448'
1'HMAC'
'AES-CTR'
'AES-CBC'
'AES-GCM'
'AES-KW'
subtle.verify(algorithm, key, signature, data)
#
algorithm
: <算法标识符> | <RsaPssParams> | <EcdsaParams> | <Ed448参数>key
: <加密密钥>signature
: <ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>data
: <ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>- 返回:<Promise>包含<boolean>
使用algorithm
中给出的方法和参数以及key
提供的密钥材料,subtle.verify()
尝试验证signature
是否是有效的加密data
的签名。返回的 Promise 通过true
或false
解析。
目前支持的算法包括:
subtle.wrapKey(format, key, wrappingKey, wrapAlgo)
#
format
:<string>必须是'raw'
、'pkcs8'
、'spki'
或'jwk'
之一。key
: <加密密钥>wrappingKey
: <加密密钥>wrapAlgo
: <算法标识符> | <RsaOaepParams> | <AesCtrParams> | <AesCbcParams> | <AesGcm参数>- 返回:包含<ArrayBuffer>的<Promise>
在密码学中,“包装密钥”是指导出然后加密密钥材料。subtle.wrapKey()
方法将密钥材料导出为format
标识的格式,然后使用wrapAlgo
指定的方法和参数以及wrappingKey
提供的密钥材料对其
进行加密。它相当于使用
format
和key
作为参数调用 subtle.exportKey()
,然后使用 wrappingKey
将结果传递给
subtle.encrypt()
方法和wrapAlgo
作为输入。如果成功,返回的 Promise 将使用
包含加密密钥数据的<ArrayBuffer>进行解析。
目前支持的环绕算法包括:
'RSA-OAEP'
'AES-CTR'
'AES-CBC'
'AES-GCM'
'AES-KW'
算法参数#
算法参数对象定义了各种<SubtleCrypto>方法使用的方法和参数。虽然这里被描述为“类”,但它们是简单的 JavaScript 字典对象。
类:AlgorithmIdentifier
#
algorithmIdentifier.name
#
- 类型:<字符串>
类:AesCbcParams
#
aesCbcParams.iv
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>
提供初始化向量。它的长度必须正好是 16 字节,并且应该是不可预测的且加密随机的。
aesCbcParams.name
#
- 类型:<string>必须是
'AES-CBC'
。
类:AesCtrParams
#
aesCtrParams.counter
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>
计数器块的初始值。该长度必须正好是 16 个字节。
AES-CTR
方法使用块的最右边的length
位作为计数器,其余位作为随机数。
aesCtrParams.length
#
- 类型:<number>
aesCtrParams.counter
中用作计数器的位数。
aesCtrParams.name
#
- 类型:<string>必须是
'AES-CTR'
。
类:AesGcmParams
#
aesGcmParams.additionalData
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区> | <未定义>
对于 AES-GCM 方法,additionalData
是未加密的额外输入,但包含在数据的身份验证中。additionalData
的使用
是可选的。
aesGcmParams.iv
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>
对于使用给定密钥的每个加密操作,初始化向量必须是唯一的。
理想情况下,这是一个确定性的 12 字节值,其计算方式确保它在使用相同密钥的所有调用中是唯一的。或者,初始化向量可以由至少12个加密随机字节组成。有关构建 AES-GCM 初始化向量的更多信息,请参阅NIST SP 800-38D第 8 节。
aesGcmParams.name
#
- 类型:<string>必须是
'AES-GCM'
。
aesGcmParams.tagLength
#
- 类型:<number>生成的身份验证标记的大小(以位为单位)。该值必须是以下值之一:
32
、64
、96
、104
、112
、120
或128
。默认值:128
。
类:AesKeyGenParams
#
aesKeyGenParams.length
#
- 类型:<数字>
要生成的 AES 密钥的长度。这必须是128
、192
或256
。
aesKeyGenParams.name
#
- 类型:<string>必须是
'AES-CBC'
、'AES-CTR'
、'AES-GCM'
或'AES-KW'
之一
类:EcdhKeyDeriveParams
#
ecdhKeyDeriveParams.name
#
- 类型:<string>必须为
'ECDH'
、'X25519'
或'X448'
。
ecdhKeyDeriveParams.public
#
- 类型:<加密密钥>
ECDH 密钥派生通过将一方私钥和另一方公钥作为输入进行操作——使用两者生成共同的共享秘密。ecdhKeyDeriveParams.public
属性设置为其他方公钥。
类:EcdsaParams
#
ecdsaParams.hash
#
如果表示为<string>,则该值必须是以下之一:
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
如果表示为<Object>,则该对象必须具有name
属性,其值是上面列出的值之一。
ecdsaParams.name
#
- 类型:<string>必须是
'ECDSA'
。
类:EcKeyGenParams
#
ecKeyGenParams.name
#
- 类型:<string>必须是
'ECDSA'
或'ECDH'
之一。
ecKeyGenParams.namedCurve
#
- 类型:<string>必须是
'P-256'
、'P-384'
、'P-521'
之一。
类:EcKeyImportParams
#
ecKeyImportParams.name
#
- 类型:<string>必须是
'ECDSA'
或'ECDH'
之一。
ecKeyImportParams.namedCurve
#
- 类型:<string>必须是
'P-256'
、'P-384'
、'P-521'
之一。
类:Ed448Params
#
ed448Params.name
#
- 类型:<string>必须是
'Ed448'
。
ed448Params.context
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区> | <未定义>
context
成员表示与消息关联的可选上下文数据。Node.js Web Crypto API 实现仅支持零长度上下文,这相当于根本不提供上下文。
类:HkdfParams
#
hkdfParams.hash
#
如果表示为<string>,则该值必须是以下之一:
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
如果表示为<Object>,则该对象必须具有name
属性,其值是上面列出的值之一。
hkdfParams.info
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>
为 HKDF 算法提供特定于应用程序的上下文输入。该长度可以为零,但必须提供。
hkdfParams.name
#
- 类型:<string>必须是
'HKDF'
。
hkdfParams.salt
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>
salt值显着提高了HKDF算法的强度。它应该是随机或伪随机的,并且应该与摘要函数的输出长度相同(例如,如果使用'SHA-256'
作为摘要,则盐应该是 256 位随机数据)。
类:HmacImportParams
#
hmacImportParams.hash
#
如果表示为<string>,则该值必须是以下之一:
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
如果表示为<Object>,则该对象必须具有name
属性,其值是上面列出的值之一。
hmacImportParams.length
#
- 类型:<数字>
HMAC 密钥中的可选位数。这是可选的,在大多数情况下应省略。
hmacImportParams.name
#
- 类型:<string>必须为
'HMAC'
。
类:HmacKeyGenParams
#
hmacKeyGenParams.hash
#
如果表示为<string>,则该值必须是以下之一:
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
如果表示为<Object>,则该对象必须具有name
属性,其值是上面列出的值之一。
hmacKeyGenParams.length
#
- 类型:<数字>
为 HMAC 密钥生成的位数。如果省略,长度将由使用的哈希算法确定。这是可选的,在大多数情况下应省略。
hmacKeyGenParams.name
#
- 类型:<string>必须是
'HMAC'
。
类:Pbkdf2Params
#
pbkdb2Params.hash
#
如果表示为<string>,则该值必须是以下之一:
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
如果表示为<Object>,则该对象必须具有name
属性,其值是上面列出的值之一。
pbkdf2Params.iterations
#
- 类型:<数字>
PBKDF2 算法在导出位时应进行的迭代次数。
pbkdf2Params.name
#
- 类型:<string>必须是
'PBKDF2'
。
pbkdf2Params.salt
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>
应至少为 16 个随机或伪随机字节。
类:RsaHashedImportParams
#
rsaHashedImportParams.hash
#
如果表示为<string>,则该值必须是以下之一:
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
如果表示为<Object>,则该对象必须具有name
属性,其值是上面列出的值之一。
rsaHashedImportParams.name
#
- 类型:<string>必须是
'RSASSA-PKCS1-v1_5'
、'RSA-PSS'
或'RSA-OAEP'
之一。
类:RsaHashedKeyGenParams
#
rsaHashedKeyGenParams.hash
#
如果表示为<string>,则该值必须是以下之一:
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
如果表示为<Object>,则该对象必须具有name
属性,其值是上面列出的值之一。
rsaHashedKeyGenParams.modulusLength
#
- 类型:<数字>
RSA 模数的长度(以位为单位)。作为最佳实践,这应该至少为2048
。
rsaHashedKeyGenParams.name
#
- 类型:<string>必须是
'RSASSA-PKCS1-v1_5'
、'RSA-PSS'
或'RSA-OAEP'
之一。
rsaHashedKeyGenParams.publicExponent
#
- 类型:<Uint8Array>
RSA 公共索引。这必须是一个<Uint8Array>,其中包含必须适合 32 位的大端无符号整数。<Uint8Array>可以包含任意数量的前导零位。该值必须是素数。除非有理由使用不同的值,否则请使用new Uint8Array([1, 0, 1])
(65537) 作为公共索引。
类:RsaOaepParams
#
rsaOaepParams.label
#
- 类型:<ArrayBuffer> | <类型化数组> | <数据视图> | <缓冲区>
不会加密的附加字节集合,但将绑定到生成的密文。
rsaOaepParams.label
参数是可选的。
rsaOaepParams.name
#
- 类型:<string>必须为
'RSA-OAEP'
。
类:RsaPssParams
#
rsaPssParams.name
#
- 类型:<string>必须为
'RSA-PSS'
。
rsaPssParams.saltLength
#
- 类型:<数字>
要使用的随机盐的长度(以字节为单位)。