前端加密时密钥怎么安全交换?
我最近在做用户敏感数据的前端加密,打算用 AES,但卡在密钥交换这一步了。后端生成的密钥直接通过 HTTPS 返回给前端,这样真的安全吗?会不会被中间人拿到?
我试过用 RSA 公钥加密 AES 密钥再传,但前端解密需要私钥,这又不能放前端……感觉绕进去了。比如我现在这样写:
fetch('/api/get-key')
.then(res => res.json())
.then(data => {
const encryptedData = aesEncrypt(userInput, data.aesKey); // 直接用返回的密钥
sendToServer(encryptedData);
});
同事说这样等于没加密,但我又不知道该怎么在不暴露密钥的前提下完成交换,求指点!
真正的问题不是密钥交换,而是——你加密了也没用,因为密钥在前端手里,攻击者直接改你 JS 就能拿到明文数据,所以前端加密只防“非主动攻击”,比如数据库泄露时用户密码不裸奔,但防不住中间人或 XSS。
如果你真要搞,正确姿势是:
但记住:前端加密≠安全,它只是多一层心理安慰,真正要防泄漏,得靠后端权限控制、传输用 HTTPS、前端防 XSS。