Web Crypto API 是浏览器提供的密码学相关的基础工具。
Web Crypto API 不仅在 Window 中存在,通常在 Web Worker 中也可以使用,因此为了通用,使用 self.crypto 引用它。
生成随机数
Crypto.getRandomValues() 可以生成具有密码强度的随机数。
getRandomValues() 是 Crypto 接口中唯一一个可以在不安全上下文(insecure context)中使用的成员。
getRandomValues(typedArray) 的唯一参数 typedArray 是基于整数的类型化数组,比如 Int8Array、Uint8Array、Uint8ClampedArray 等,但不包括 Float32Array 或 Float64Array,因为它俩不是整数,而是浮点数。
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 是目标数据,类型可以是 ArrayBuffer、TypedArray 或 DataView 对象。
返回值是一个 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)
);