必须用Worker处理SHA-256,因主线程调用crypto.subtle.digest会阻塞渲染与交互;需将File转ArrayBuffer并transferable传递,分块读取后一次性计算,且须HTTPS/localhost环境。
为什么必须用Worker处理SHA-256
直接在主线程调用
计算大文件哈希,会阻塞页面渲染和用户交互。哪怕只是100MB的文件,也可能导致界面卡顿数秒——浏览器无法响应点击、滚动或输入。Web Worker把加密任务移到后台线程,主线程保持60fps流畅,这是体验分水岭。
Worker中执行SHA-256的正确写法
不能把整个File对象传给Worker,需先转为ArrayBuffer再传输;且必须启用
机制避免内存拷贝开销:
主线程中:用
获取缓冲区,再通过
传递(方括号表示转移所有权)
Worker内:直接对收到的ArrayBuffer调用
结果用
转十六进制字符串后,再
回主线程
大文件要分块,但不是“流式哈希”
浏览器Web Crypto API不支持增量digest,所谓“边读边算”会得到错误结果。真正安全的做法是:
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
用
按固定大小(如4MB)切片
逐片读取并
其
,全部加载进内存后一次性调用digest
若文件过大(如>500MB),建议改用
库,它基于WASM实现真正的流式SHA-256,且可在Worker中运行
实际部署要注意的硬性条件
几个容易忽略却会导致失败的前提:
立即学习
“
前端免费学习笔记(深入)
”;
必须运行在HTTPS或
下,否则
会抛SecurityError
SHA-1已淘汰,只用
或
Worker脚本需单独存放为
文件,不能是内联字符串
上传前校验只是辅助,服务端必须重新计算哈希比对——前端结果可被绕过
crypto.subtle.digest("SHA-256", buffer)transferablefile.arrayBuffer()postMessage(buffer, [buffer])crypto.subtle.digest("SHA-256", buffer)Uint8ArraypostMessageFile.slice()awaitarrayBuffer()hash-wasmlocalhostcrypto.subtle"SHA-256""SHA-512".js