Web Crypto API 是浏览器提供的密码学相关的基础工具。

Web Crypto API 不仅在 Window 中存在,通常在 Web Worker 中也可以使用,因此为了通用,使用 self.crypto 引用它。

生成随机数

Crypto.getRandomValues() 可以生成具有密码强度的随机数。

getRandomValues()Crypto 接口中唯一一个可以在不安全上下文insecure context)中使用的成员。

getRandomValues(typedArray) 的唯一参数 typedArray 是基于整数的类型化数组,比如 Int8ArrayUint8ArrayUint8ClampedArray 等,但不包括 Float32ArrayFloat64Array,因为它俩不是整数,而是浮点数。

const arr = new Uint8Array(10);
self.crypto.getRandomValues(arr);
console.log(arr);
// Uint8Array(10) [9, 33, 2, 232, 65, 49, 48, 208, 5, 237]

生成 UUID

使用 crypto.randomUUID() 生成 UUID。

const uuid = self.crypto.randomUUID();
console.log(uuid);
//=> 'c07b42e1-0904-44c7-9e7e-fd92dabc1fd0'

crypto.subtle 只读属性包含更多“微妙”的密码学操作。

生成摘要

使用 crypto.subtle.digest(algorithm, data) 创建消息的摘要。

algorithm 表示摘要算法,可以是字符串,也可以是包含 name 属性的对象。可选值有:

  • "SHA-1" 不建议使用它,因为它已被破解
  • "SHA-256"
  • "SHA-384"
  • "SHA-512"

data 是目标数据,类型可以是 ArrayBufferTypedArrayDataView 对象。

返回值是一个 Promise,最终值是一个 ArrayBuffer 类型,包含摘要信息。

const text = "An obscure body in the S-K system";

async function digestMessage(message) {
    const encoder = new TextEncoder();
    const data = encoder.encode(message);
    return await self.crypto.subtle.digest("SHA-256", data);
}

digestMessage(text).then((digestBuffer) => 
    console.log(digestBuffer.byteLength)
)