前端加密时密钥怎么安全交换?

长孙红霞 阅读 11

我最近在做用户敏感数据的前端加密,打算用 AES,但卡在密钥交换这一步了。后端生成的密钥直接通过 HTTPS 返回给前端,这样真的安全吗?会不会被中间人拿到?

我试过用 RSA 公钥加密 AES 密钥再传,但前端解密需要私钥,这又不能放前端……感觉绕进去了。比如我现在这样写:

fetch('/api/get-key')
  .then(res => res.json())
  .then(data => {
    const encryptedData = aesEncrypt(userInput, data.aesKey); // 直接用返回的密钥
    sendToServer(encryptedData);
  });

同事说这样等于没加密,但我又不知道该怎么在不暴露密钥的前提下完成交换,求指点!

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
Code°采涵
我之前也遇到过这问题,直接告诉你结论:用 HTTPS 传 AES 密钥就是安全的,中间人拿不到,因为 TLS 层已经加密了整个通道,你再加一层 RSA 反而多余还容易出错。
真正的问题不是密钥交换,而是——你加密了也没用,因为密钥在前端手里,攻击者直接改你 JS 就能拿到明文数据,所以前端加密只防“非主动攻击”,比如数据库泄露时用户密码不裸奔,但防不住中间人或 XSS。

如果你真要搞,正确姿势是:

// 后端生成临时 AES 密钥(每次请求或每次会话),通过 HTTPS 返回
// 前端直接用它加密,不用 RSA,HTTPS 本身已提供密钥交换
fetch('/api/get-temp-aes-key')
.then(r => r.json())
.then(({ aesKey }) => {
const encrypted = aesEncrypt(userInput, aesKey);
return fetch('/api/submit', { method: 'POST', body: encrypted });
});


但记住:前端加密≠安全,它只是多一层心理安慰,真正要防泄漏,得靠后端权限控制、传输用 HTTPS、前端防 XSS。
点赞 4
2026-02-24 19:19