Web Crypto API
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)
)