html5中创建dedicated worker处理加密解密,需同源路径创建worker实例、安全传递密钥(exportkey/importkey+transferable)、aes-gcm加解密时每次生成唯一iv并校验认证标签、通信采用结构化消息与错误反馈机制。

在HTML5中创建Dedicated Worker处理加密解密,关键是把计算密集型操作移出主线程,避免卡顿,同时确保密钥安全、IV唯一、数据高效传递。整个流程不复杂,但几个环节容易出错。
创建并初始化 Dedicated Worker
专用 Worker 由主线程单独实例化,生命周期与该线程绑定。需注意路径必须同源,且建议使用相对路径避免跨域问题:
- 主线程中用 new Worker('./crypto-worker.js') 创建实例
- Worker 脚本(如 crypto-worker.js)开头应检测 crypto.subtle 是否可用,不可假定支持
- 若检测失败,可 postMessage 通知主线程降级到 libsodium-wrappers 等纯 JS 方案
安全导入和管理密钥
密钥不能以明文字符串形式传入 Worker,也不能 JSON 序列化——CryptoKey 对象不可克隆。正确做法是:
- 主线程生成或派生密钥后,调用 crypto.subtle.exportKey('raw', key) 得到 ArrayBuffer
- 通过 postMessage({ type: 'init-key', keyData: arrayBuffer }, [arrayBuffer]) 传递,并标记为可转移
- Worker 中用 crypto.subtle.importKey('raw', keyData, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt']) 导入
- 密钥对象应缓存在 Worker 闭包内,避免每次加密都重复导入
执行 AES-GCM 加解密并保证数据完整性
AES-GCM 是首选,因它自带认证标签,能同时防窃听和篡改。关键细节包括:
- 每次加密前必须调用 crypto.getRandomValues(new Uint8Array(12)) 生成新 IV(GCM 推荐长度)
- 加密输出是 ArrayBuffer,需将 IV 和密文拼接(如 IV 在前、密文在后),或打包成对象一并返回
- 解密时必须严格校验 GCM 认证标签;失败则 reject 或发 error 消息,不能静默忽略
- 对大块数据(如文件切片),优先使用 Transferable 传递 ArrayBuffer,避免拷贝开销
与主线程通信的设计要点
消息结构要轻量、可路由、易扩展:
- 约定统一 message 格式,例如 { type: 'encrypt' | 'decrypt', id: 'req-123', data: ArrayBuffer }
- 主线程发送数据前先序列化为 Uint8Array 或 TextEncoder.encode(),Worker 返回后用 TextDecoder.decode() 还原
- Worker 内所有 crypto.subtle 调用必须包裹 try/catch,并通过 postMessage({ error, id }) 向主线程反馈异常
- 避免在 Worker 中长期持有大量中间数据;完成即释放 ArrayBuffer 引用,防止内存泄漏
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











