Skip to content

加解密

RSA和AES加密的主要区别:

RSA(非对称加密):

  • 使用一对密钥:公钥和私钥
  • 公钥加密,私钥解密(或相反)
  • 加密速度慢,适合加密少量数据
  • 常用于数字签名、密钥交换

AES(对称加密):

  • 使用同一个密钥进行加密和解密
  • 加密速度快,适合加密大量数据
  • 密钥需要安全传输和保存
  • 常用于文件加密、数据传输

实际应用:

通常两者结合使用 - 用RSA加密AES的密钥,用AES加密实际数据,这样既保证了安全性又提高了效率。

我的理解:RSA 公钥和私钥都是服务器生成的,然后服务器把公钥给前端,前端通过这个公钥给 AES 上锁,服务器用自己生成的私钥解密,返回的时候数据用 AES 加密,前端需要用 AESKey 才能解密获取到数据,我理解的对吗?

claude-4.0 的回答:

完全正确! 你理解得很准确👍

完整流程确认

初始阶段:

  • 服务器生成RSA密钥对(公钥+私钥)
  • 公钥写死在前端代码里
  • 私钥保存在服务器,绝不泄露

握手阶段:

  1. 前端用RSA公钥给AES密钥"上锁"
  2. 服务器用RSA私钥"开锁",拿到AES密钥
  3. 双方确认都有同一个AES密钥

业务通信阶段:

  • 前端发请求:用AES密钥加密业务数据
  • 服务器返回:也用同一个AES密钥加密返回数据
  • 前端解密:用AES密钥解密拿到真实数据

用比喻来说

就像:

  1. 银行(服务器)做了一把特殊的锁和钥匙

  2. 锁的样式(公钥)告诉所有人

  3. 你要寄保险箱密码给银行,就用这个锁锁上

  4. 只有银行有开锁的钥匙(私钥)

  5. 之后你们就用保险箱密码(AES密钥)来加密所有东西

为什么不直接用RSA?

RSA加密很慢,AES很快:

  • RSA:只用来保护AES密钥(数据很小)
  • AES:用来保护业务数据(可能很大)

这样既安全又高效!你的理解完全正确 ✅

追问:那如果前端的 AES 密钥泄露了,会不会有安全隐患?

claude-4.0 的回答:

会有安全隐患! 你问得很好👍

当前设计的问题

AES密钥是写死的:

encrypt.js

let local_AESRandomKey = '612F49AE082D587B';

这意味着:

  • 任何人打开前端代码都能看到这个密钥
  • 实际上已经"泄露"了

可能的安全风险

数据窃听

  • 攻击者拿到AES密钥后,可以解密所有通信数据
  • 如果抓包获得加密数据,就能解密查看

请求伪造

  • 知道加密方式后,可以构造假的请求
  • 虽然还需要token和sessionId,但增加了风险

中间人攻击

  • 攻击者可以拦截、解密、修改、重新加密数据

当前的保护机制

不过项目还有其他安全层:

  • JWT Token 身份验证
  • SessionId 会话管理
  • 握手验证 服务器会验证密钥
  • 服务器端权限控制

更安全的做法

理想情况下应该:

javascript

Apply to encrypt.js

// 每次生成随机AES密钥

let local_AESRandomKey = generateRandomKey();

// 或者服务器生成后通过RSA传给客户端

现实考虑

但这样做会:

  • 增加复杂度
  • 可能影响性能
  • 开发成本更高

对于内部系统或者风险较低的应用,现在这种方式虽然不是最完美的,但结合其他安全机制,在可接受范围内。

简单说:有风险,但不是致命的,要看具体应用场景的安全要求。