边缘开发者平台
  • 边缘函数
    • 概述
    • 快速指引
    • 操作指引
      • 函数管理
      • 触发配置
    • Runtime APIs
      • addEventListener
      • Cache
      • Cookies
      • Encoding
      • Fetch
      • FetchEvent
      • Headers
      • Request
      • Response
      • Streams
        • ReadableStream
        • ReadableStreamBYOBReader
        • ReadableStreamDefaultReader
        • TransformStream
        • WritableStream
        • WritableStreamDefaultWriter
      • Web Crypto
      • Web standards
      • Images
        • ImageProperties
    • 示例函数
      • 返回 HTML 页面
      • 返回 JSON
      • Fetch 远程资源
      • 请求头鉴权
      • 修改响应头
      • AB 测试
      • 设置 Cookie
      • 基于请求区域重定向
      • Cache API 使用
      • 缓存 POST 请求
      • 流式响应
      • 合并资源流式响应
      • 防篡改校验
      • m3u8 改写与鉴权
      • 图片自适应缩放
      • 图片自适应 WebP
      • 自定义 Referer 限制规则
      • 远程鉴权
      • HMAC 数字签名
      • 自定义下载文件名
      • 获取客户端 IP
    • 最佳实践
      • 通过边缘函数实现自适应图片格式转换

Web Crypto

Web Crypto API 基于 Web APIs 标准 Web Crypto API 进行设计。提供了一组常见的加密操作接口,相比纯 JavaScript 实现的加密接口,Web Crypto API 的性能更高。
注意:
不支持直接构造 Crypto 对象,边缘函数运行时会在全局注入,直接使用全局 crypto 实例即可。

描述

// 编码
const encodeContent = new TextEncoder().encode('hello world');
// 使用 crypto,生成 SHA-256 哈希值 Promise<ArrayBuffer>
const sha256Content = await crypto.subtle.digest(
{ name: 'SHA-256' },
encodeContent
);
const result = new Uint8Array(sha256Content);

属性

// crypto.subtle
readonly subtle: SubtleCrypto;
提供常见的加密操作, 例如: 哈希、签名/验签、加解密等,详情参见 SubtleCrypto

方法

getRandomValues

crypto.getRandomValues(buffer: TypedArray): TypedArray;
生成随机数填充 buffer, 并返回 buffer。

参数

属性名
类型
必填
说明
buffer
随机数缓冲区,不超过 65536 字节。详情参见 TypedArray

randomUUID

crypto.randomUUID(): string;
返回随机 UUID(v4)。

SubtleCrypto

提供常见的加密操作, 例如: 哈希、签名/验签、加解密等,详情参见 MDN 官方文档:SubtleCrypto
说明:
SubtleCrypto 加密接口按功能分为两类:
加密功能,包含 encrypt/decryptsign/verifydigest, 可以用来实现隐私和身份验证等安全功能。
密钥管理功能,包含 generateKeyderiveKeyimportKey/exportKey, 可以用来管理密钥。

digest

crypto.subtle.digest(algorithm: string | object, data: ArrayBuffer): Promise<ArrayBuffer>;
返回 Promise 对象,包含生成的数据摘要(hash),详情参见 MDN 官方文档:SubtleCrypto.digest

encrypt

crypto.subtle.encrypt(algorithm: object, key: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer>;
返回 Promise 对象,包含加密数据,详情参见 MDN 官方文档:SubtleCrypto.encrypt
对于 RSA-OAEP 算法,要求 data 长度不能超过 modulusLength/8 - 2*hLen -2,其中 hLen 的取值逻辑为:
SHA-1: hLen = 20 byte
SHA-256: hLen = 32 byte
SHA-384: hLen = 48 byte
SHA-512: hLen = 64 byte
对于 AES-CTRAES-CBCAES-GCM,限制 data 长度 1MB。

decrypt

crypto.subtle.decrypt(algorithm: object, key: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer>;
返回 Promise 对象,包含解密数据,详情参见 MDN 官方文档:SubtleCrypto.decrypt
对于 RSA-OAEP 算法, data 长度为 modulusLength/8。
对于 AES-CTRAES-CBCAES-GCM,限制 data 长度 1MB。

sign

crypto.subtle.sign(algorithm: string | object, key: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer>;
返回 Promise 对象,包含数据签名,详情参见 MDN 官方文档:SubtleCrypto.sign

verify

crypto.subtle.verify(algorithm: string | object, key: CryptoKey, signature: BufferSource, data: ArrayBuffer): Promise<boolean>;
返回 Promise 对象,包含签名验证结果,详情参见 MDN 官方文档:SubtleCrypto.verify

generateKey

crypto.subtle.generateKey(algorithm: object, extractable: boolean, keyUsages: Array<string>): Promise<CryptoKey | CryptoKeyPair>;
返回 Promise 对象,包含密钥 CryptoKey或密钥对 CryptoKeyPair,详情参见 MDN 官方文档:SubtleCrypto.generateKey

deriveKey

crypto.subtle.deriveKey(algorithm: object, baseKey: CryptoKey, derivedKeyAlgorithm: object, extractable: boolean, keyUsages: Array<string>): Promise<CryptoKey>;
返回 Promise 对象,包含密钥 CryptoKey,详情参见 MDN 官方文档:SubtleCrypto.deriveKey

importKey

crypto.subtle.importKey(format: string, keyData: BufferSource, algorithm: string | object, extractable: boolean, keyUsages: Array<string>): Promise<CryptoKey>;
返回 Promise 对象,包含密钥 CryptoKey,详情参见 MDN 官方文档:SubtleCrypto.importKey

exportKey

crypto.subtle.exportKey(format: string, key: CryptoKey): Promise<ArrayBuffer>;
返回 Promise 对象,包含导出密钥 ArrayBuffer,详情参见 MDN 官方文档:SubtleCrypto.exportKey

deriveBits

crypto.subtle.deriveBits(algorithm: object, baseKey: CryptoKey, length: integer): Promise<ArrayBuffer>;
返回 Promise 对象,包含伪随机字节 ArrayBuffer,详情参见 MDN 官方文档:SubtleCrypto.deriveBits

wrapKey

crypto.subtle.wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgo: string | object): Promise<ArrayBuffer>;;
返回 Promise 对象,包含封装密钥 ArrayBuffer,详情参见 MDN 官方文档:SubtleCrypto.wrapKey

unwrapKey

crypto.subtle.unwrapKey(format: string, wrappedKey: ArrayBuffer, unwrappingKey: CryptoKey, unwrapAlgo: string | object, unwrappedKeyAlgo: string | object, extractable: boolean, keyUsages: Array<string>): Promise<CryptoKey>;
返回 Promise 对象,包含解封密钥 CryptoKey,详情参见 MDN 官方文档:SubtleCrypto.unwrapKey

CryptoKey

CryptoKey 表示用加密算法生成的密钥,详细参见 MDN 官方文档 CryptoKey。不支持直接构造 CryptoKey 对象,使用下述接口生成密钥:
CryptoKey 属性描述如下。
属性名
类型
只读
说明
type
string
密钥类型。
extractable
boolean
密钥是否可导出。
algorithm
object
算法相关, 包含算法需要的字段。
usages
Array<string>
密钥的用途。

CryptoKeyPair

CryptoKeyPair 表示用加密算法生成的密钥对,详细参见 MDN 官方文档:CryptoKeyPair。不支持直接构造 CryptoKeyPair 对象,使用下述接口生成密钥对:
CryptoKeyPair 属性描述如下。
属性名
类型
只读
说明
privateKey
对于加解密算法, 私钥用于解密。对于签名算法, 私钥用于签名。
publicKey
对于加解密算法, 公钥用于加密。对于签名算法, 公钥用于验签。

支持算法

边缘函数支持 Web APIs 标准 WebCrypto 定义的所有算法,详细如下表所示。
Algorithm
encrypt() decrypt()
sign() verify()
wrapKey() unwrapKey()
deriveKey() deriveBits()
generateKey()
importKey()
exportKey()
digest()
RSASSA-PKCS1-v1_5
-
-
-
-
RSA-PSS
-
-
-
-
RSA-OAEP
-
-
-
ECDSA
-
-
-
-
ECDH
-
-
-
-
HMAC
-
-
-
-
AES-CTR
-
-
-
AES-CBC
-
-
-
AES-GCM
-
-
-
AES-KW
-
-
-
-
HKDF
-
-
-
-
-
-
PBKDF2
-
-
-
-
-
-
SHA-1
-
-
-
-
-
-
-
SHA-256
-
-
-
-
-
-
-
SHA-384
-
-
-
-
-
-
-
SHA-512
-
-
-
-
-
-
-
MD5
-
-
-
-
-
-
-

示例代码

function uint8ArrayToHex(arr) {
return Array.prototype.map.call(arr, (x) => ((`0${x.toString(16)}`).slice(-2))).join('');
}

async function handleEvent(event) {
const encodeArr = TextEncoder().encode('hello world');
// 执行 md5
const md5Buffer = await crypto.subtle.digest({ name: 'MD5' }, encodeArr);
// 输出十六进制字符串
const md5Str = uint8ArrayToHex(new Uint8Array(md5Buffer));

const response = new Response(md5Str);
return response;
}

addEventListener('fetch', async (event) => {
event.respondWith(handleEvent(event));
});

相关参考