vue 3文件上传流加密的核心是分片+每片独立加密+安全元数据管理:用file.slice分片(2–8mb),web worker中aes-gcm/sm4-gcm加密并生成唯一iv,上传纯密文blob与元数据分离,后端校验authtag、iv唯一性及合并密文。

在 Vue 3 中实现文件上传流的加密传输,核心不是“边传边加密流”,而是分片 + 每片独立加密 + 安全元数据管理。浏览器不支持真正意义上的 HTTP 流式加密(如 TLS 层之外再加应用层流加密),但可以通过合理设计达到等效效果:既避免内存爆炸,又确保每个传输单元都是密文,且具备完整性与可恢复性。
以下是关键实现路径和实操要点:
分片是加密的前提,不是可选项
- 直接读整个大文件进内存做 AES 加密 → 主线程卡死、低端设备白屏、超时重试成本高。
- 正确做法:用
file.slice(start, end)切出固定大小分片(如 4MB),每片单独处理。 - 分片大小需权衡:太小 → 请求过多、服务端压力大;太大 → 失败重传代价高。推荐 2–8MB,视业务网络环境调整。
加密必须脱离主线程,用 Web Worker 承载
- 所有对分片 ArrayBuffer 的加密操作(AES-GCM、SM4 等)必须放在 Web Worker 中执行。
- 主线程只负责调度、切片、上传、进度更新,不碰原始字节或密钥。
- 示例逻辑(Worker 内):
self.onmessage = async ({ data: { chunkArrayBuffer, key, iv } }) => { const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, key, chunkArrayBuffer ); self.postMessage({ encrypted, iv }); };
选对加密模式:优先 AES-GCM 或 SM4-GCM
- 不要用 ECB(不安全)、CBC(需额外 HMAC 防篡改)、纯 AES-CBC(无认证)。
- AES-GCM / SM4-GCM 是首选:一次调用完成加密 + 认证,输出含密文 + 认证标签(authtag),服务端可校验完整性与未被篡改。
- 每个分片使用唯一 IV(12 字节随机生成),IV 随密文一起上传(明文传,不保密,但不可复用)。
上传请求体必须是纯密文 + 元数据,禁用 FormData 包裹原始文件
- 错误做法:
formData.append('chunk', blob)→ Blob 可能隐式触发解密/转换,且无法控制二进制格式。 - 正确做法:
- 将加密后的
ArrayBuffer转为Uint8Array,再构造Blob([uint8Array], {type: 'application/octet-stream'}); - 设置请求头
Content-Type: application/octet-stream; - 所有元数据(文件 ID、分片序号、总片数、IV、签名等)走 URL 参数或 JSON body(若后端支持),绝不混入二进制流。
- 将加密后的
后端必须做三件事,否则前端加密形同虚设
- 接收后立即校验 GCM authtag,失败直接拒收该分片;
- 合并前验证所有分片的 IV 是否唯一、是否按序、是否缺失;
- 最终合并密文文件(不是先解密再合并),解密动作留在下载或业务使用环节,保证存储态也是密文。
密钥不能硬编码,也不能由前端生成后明文传给后端
- 敏感场景(如医疗、金融)必须用混合加密:
- 前端用后端 RSA 公钥加密本次会话的 AES 密钥;
- 把加密后的密钥(
encryptedKey)随第一个分片上传; - 后端用 RSA 私钥解出 AES 密钥,缓存至本次上传会话生命周期内;
- 简单场景可用协商密钥(如基于用户登录态派生),但需防重放(加时间戳 + nonce 签名)。
不复杂但容易忽略。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











