You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何安全存储AES加密所需的Secret和IV以实现请求体加密?

解决方案:React 请求体 AES 加密的安全密钥管理方案

一、基于会话的动态密钥协商(推荐)

  • 登录成功后,后端主动生成AES密钥(Secret+IV),用用户的RSA公钥加密后返回前端。前端无需存储密钥,每次请求前临时向后端获取加密后的密钥片段,用本地持有的RSA私钥解密得到AES密钥,加密请求体后立即销毁内存中的密钥。
  • 后端需给密钥设置极短有效期(比如1分钟),且每个请求的密钥片段动态变化,避免重复使用。

二、利用Web Crypto API的内存密钥存储

  • 绝不使用localStorage或sessionStorage存储任何密钥相关数据,将生成的AES密钥对象(通过crypto.subtle.generateKey创建的CryptoKey实例)保存在内存变量中(比如React全局状态或自定义Hook的闭包变量)。
  • 页面刷新后,通过后端提供的密钥重协商接口,用有效的access_token重新获取AES密钥,彻底摆脱本地存储依赖。
  • 核心代码片段:
// 生成AES密钥并保存在内存
async function generateAesKey() {
  const key = await crypto.subtle.generateKey(
    { name: "AES-GCM", length: 256 },
    true,
    ["encrypt", "decrypt"]
  );
  return key;
}

// 加密请求体
async function encryptRequestBody(key, data) {
  const encoder = new TextEncoder();
  const dataBytes = encoder.encode(JSON.stringify(data));
  const iv = crypto.getRandomValues(new Uint8Array(12)); // GCM模式推荐12字节IV
  const encrypted = await crypto.subtle.encrypt(
    { name: "AES-GCM", iv: iv },
    key,
    dataBytes
  );
  return {
    encryptedData: btoa(String.fromCharCode(...new Uint8Array(encrypted))),
    iv: btoa(String.fromCharCode(...iv))
  };
}

三、密钥衍生函数(KDF)增强方案

  • 如果必须基于access_token衍生密钥,放弃直接用SHA256,改用PBKDF2或HKDF这类专门的密钥衍生函数,加入动态盐值提升破解难度:
    • 每次登录时,后端返回一个随机盐值(salt),和access_token一起作为HKDF的输入生成AES密钥。
    • 盐值随access_token同步更新,每次请求用当前盐值衍生密钥,即使破解了某次密钥,也无法复用逻辑推导其他会话的密钥。
  • 核心代码片段:
async function deriveAesKey(accessToken, salt) {
  const encoder = new TextEncoder();
  const tokenBytes = encoder.encode(accessToken);
  const saltBytes = encoder.decode(atob(salt)); // 后端返回的base64盐值
  // 用HKDF衍生密钥
  const derivedKey = await crypto.subtle.deriveKey(
    {
      name: "HKDF",
      hash: "SHA-256",
      salt: saltBytes,
      info: encoder.encode("request-body-encryption") // 固定区分用途的信息字段
    },
    await crypto.subtle.importKey(
      "raw",
      tokenBytes,
      "HKDF",
      false,
      ["deriveKey"]
    ),
    { name: "AES-GCM", length: 256 },
    true,
    ["encrypt", "decrypt"]
  );
  return derivedKey;
}

四、前端安全补充措施

  • 启用Content Security Policy (CSP),禁止内联脚本和未授权脚本执行,防范XSS攻击窃取内存中的密钥。
  • 对access_token使用HttpOnly+Secure+SameSite=Strict属性的Cookie存储,避免XSS窃取access_token。
  • 页面卸载时主动销毁内存中的密钥对象(比如将变量置为null),缩短密钥暴露窗口。

内容的提问来源于stack exchange,提问作者İbrahim Yılgör

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:53:21