必须用worker处理sha-256,因主线程调用crypto.subtle.digest会阻塞渲染与交互;需将file转arraybuffer并transferable传递,分块读取后一次性计算,且须https/localhost环境。

为什么必须用Worker处理SHA-256
直接在主线程调用crypto.subtle.digest("SHA-256", buffer)计算大文件哈希,会阻塞页面渲染和用户交互。哪怕只是100MB的文件,也可能导致界面卡顿数秒——浏览器无法响应点击、滚动或输入。Web Worker把加密任务移到后台线程,主线程保持60fps流畅,这是体验分水岭。
Worker中执行SHA-256的正确写法
不能把整个File对象传给Worker,需先转为ArrayBuffer再传输;且必须启用transferable机制避免内存拷贝开销:
- 主线程中:用
file.arrayBuffer()获取缓冲区,再通过postMessage(buffer, [buffer])传递(方括号表示转移所有权) - Worker内:直接对收到的ArrayBuffer调用
crypto.subtle.digest("SHA-256", buffer) - 结果用
Uint8Array转十六进制字符串后,再postMessage回主线程
大文件要分块,但不是“流式哈希”
浏览器Web Crypto API不支持增量digest,所谓“边读边算”会得到错误结果。真正安全的做法是:
- 用
File.slice()按固定大小(如4MB)切片 - 逐片读取并
await其arrayBuffer(),全部加载进内存后一次性调用digest - 若文件过大(如>500MB),建议改用
hash-wasm库,它基于WASM实现真正的流式SHA-256,且可在Worker中运行
实际部署要注意的硬性条件
几个容易忽略却会导致失败的前提:
- 必须运行在HTTPS或
localhost下,否则crypto.subtle会抛SecurityError - SHA-1已淘汰,只用
"SHA-256"或"SHA-512" - Worker脚本需单独存放为
.js文件,不能是内联字符串 - 上传前校验只是辅助,服务端必须重新计算哈希比对——前端结果可被绕过
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











