离线数据同步需主动集成Web Crypto API实现端到端加密,核心是同步前加密、同步后解密,密钥不得落地;必须使用AES-GCM、动态IV、内存持钥,并严防HTTPS缺失、CSP宽松及XSS漏洞。

离线数据同步本身不自带加密能力,必须主动集成 Web Crypto API 才能保护暂存数据的隐私。核心不是“同步时加密”,而是“同步前加密、同步后解密”,且密钥不能随数据一起落地。
同步前先加密,再存入本地存储
所有待离线同步的数据(如草稿、表单、缓存记录)在写入 localStorage 或 IndexedDB 前,必须完成端到端加密:
- 使用 AES-GCM 算法,确保加密同时附带完整性校验,避免篡改后静默解密成功
- 每次加密都生成全新 12 字节 IV,不可复用;密钥不硬编码、不存 Storage,推荐 PBKDF2 派生或服务端下发的一次性密钥
- 加密结果(ArrayBuffer)转为 base64url 编码,并与 IV、salt(若使用口令派生)、算法标识一并结构化保存,例如:
{ "iv": "base64", "salt": "base64", "data": "base64" }
同步过程不暴露明文,也不传输密钥
加密后的数据可安全上传至服务端,但关键原则是:
- 服务端只接收、存储和转发密文,不参与加解密——密钥始终保留在前端内存中
- 若需服务端辅助(如多端同步),应由服务端用 RSA 公钥加密 AES 密钥后返回,前端用私钥解出并仅内存持有
- 避免把密钥拼进 URL、Header 或请求体;JWT 类凭证不应走此路径,而应改用 httpOnly Cookie + 短时效机制
离线状态下解密逻辑必须受限且可控
用户在无网时查看或编辑已加密数据,需满足:
立即学习“前端免费学习笔记(深入)”;
- 解密操作仅在用户明确触发时执行(如点击“查看草稿”),不自动后台解密
- 若依赖口令,每次解密都需重新输入密码,防止恶意脚本静默调用
- IndexedDB 中若存加密数据,建议按业务域分库/分对象存储,避免单点泄露影响全部数据
基础防护不到位,加密就形同虚设
即使用了 AES-GCM,以下任一缺失都会让加密失效:
- 页面未启用 HTTPS:Web Crypto API 在非安全上下文(HTTP)中直接不可用
- CSP 策略宽松:允许 unsafe-inline 或 eval,攻击者可注入脚本劫持解密函数或读取内存中的明文
- 存在高危 XSS 漏洞:恶意脚本可 hook crypto.subtle.decrypt,截获解密结果或密钥参数



















