应使用aes-256-gcm模式加密,密钥由web crypto api动态生成且不可导出,iv每次随机生成12字节并随密文传输,authtag必须完整保存,加密结果结构化为含alg、iv、tag、ciphertext的base64编码json。

你需要在云存储场景中确保数据从客户端上传到云端、以及云端落盘时全程加密,防止中间人窃听和云服务商明文访问。AES 加密必须使用安全的密钥管理方式、带认证的加密模式(如 GCM),且加密参数不可硬编码或复用。
生成并安全保管 AES-GCM 密钥与随机数
第一步:调用操作系统级安全随机源生成 32 字节 AES-256 密钥,而非用 Math.random() 或时间戳拼接——后者可被暴力预测。
第二步:为每次加密独立生成 12 字节随机 IV(初始化向量),不能重复使用同一 IV 加密不同数据,否则 GCM 模式会泄露明文前缀。
第三步:将密钥交由客户端密钥管理系统(如 Web Crypto API 的 SubtleCrypto.generateKey)生成,密钥对象设为 extractable: false,防止被 script 窃取导出。
第四步:IV 需随密文一并传输,但【IV 不需要保密,但绝不可复用】;密钥则永远不上传、不日志、不存 localStorage。
使用 Web Crypto API 执行 AES-GCM 加密
方法一:前端浏览器环境加密(推荐)
调用 window.crypto.subtle.encrypt({ name: "AES-GCM", iv: ivArrayBuffer }, key, plainDataArrayBuffer) → 返回加密后 ArrayBuffer。
注意:plainDataArrayBuffer 必须是 Uint8Array 转换而来,直接传字符串会静默失败。
方法二:Node.js 环境使用 crypto module
const cipher = crypto.createCipheriv("aes-256-gcm", key, iv); cipher.setAAD(aadBuffer); let encrypted = cipher.update(data, "utf8", "base64") + cipher.final("base64"); const authTag = cipher.getAuthTag();
【authTag 必须与密文一起保存,缺失则解密必然失败】
封装加密结果为标准传输结构
将 IV、密文、认证标签(authTag)、算法标识(如 "AES-256-GCM")序列化为 JSON 对象:
{ "alg": "AES-256-GCM", "iv": base64Encode(iv), "tag": base64Encode(authTag), "ciphertext": base64Encode(encryptedData) }
不要省略 alg 字段——服务端需据此选择对应解密逻辑,避免硬编码假设算法。
整个 JSON 字符串作为请求体 POST 到上传接口,Content-Type 设为 application/json。
服务端接收并验证加密载荷
解析 JSON 请求体 → 校验 alg 字段是否在白名单内(仅允许 "AES-256-GCM")→ base64 解码 iv、tag、ciphertext → 使用相同密钥调用 crypto.decrypt() 验证 authTag 并解密 → 解密失败立即返回 400 错误,不记录原始密文。
解密成功后,将明文写入云存储对象时,【禁止再次 AES 加密落盘】——云厂商提供的静态加密(如 AWS S3 SSE-KMS)已覆盖磁盘层,双重加密徒增开销且易引入密钥管理混乱。











