功能说明
SHA-256 常用于校验内容完整性和生成稳定标识。该函数通过 Web Crypto 的 subtle.digest 计算摘要,接受字符串或字节数组,输出 64 位小写十六进制,可直接与已知哈希比较。verifySha256 额外校验期望值的格式,适合缓存键、文件校验和内容寻址场景。
关键代码
字符串先用 TextEncoder 转为 UTF-8 字节。crypto.subtle.digest 返回 ArrayBuffer,随后转成 Uint8Array,每个字节用 toString(16) 并补足两位,最后拼接。函数为异步,因为 Web Crypto 接口返回 Promise;相同输入始终得到相同摘要。
const digest = await crypto.subtle.digest("SHA-256", bytes);
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
使用注意
SHA-256 不是密码哈希,不能直接存储密码,应使用 scrypt、Argon2 等带盐慢哈希。该函数不提供密钥,不能替代 HMAC。Web Crypto 在非安全上下文可能不可用。输入类型受限,其他 ArrayBufferView 需先转换。比较摘要使用普通相等即可,摘要本身不是秘密。
验证方式
断言 sha256Hex(“abc”) 返回 ba7816bf 开头的标准摘要,sha256Hex(“”) 返回 e3b0c442 开头的摘要。同一输入多次结果一致。Uint8Array 输入与等价字符串结果一致。verifySha256 对正确摘要返回 true,对 63 位或非十六进制输入抛 RangeError。