用 RSA 和 AES 对接口进行加密

对浏览器或者 APP 进行抓包的时候,请求体和响应体都会暴露在抓包工具下,为了提高抓包的成本,可以对请求体和相应体进行 AES 加密,服务端在发送数据时,都使用相同的 AES Secret 对数据进行加密,收到数据后,再用 AES Secret 进行解密。

如果 AES Secret 被轻松截获,那么加密也就很容易破解,所以 AES Secret 必须是经常变化、而且可以为不同的用户生成不同的 Secret , 关于 Secret 的生成,可以在服务器设计一些逻辑去处理。但是当用户打开页面或者登录 APP 时,如何安全的从服务器获取新生成的 AES Secret 呢?

比较好的解决方案则是用客户端 RSA 密钥来保护 AES Secret ,具体流程如下

  1. 用户打开网页 或 APP
  2. 调用 API 之前,先通过 window.crypto 或者 keyStore 去生成 KeyPair
  3. KeyPair 的公钥导出,发送给服务器
  4. 服务器生成 AES Secret ,并且用客户端发来的公钥对 Secret 进行加密并返回
  5. 客户端收到加密的 Secret 后,用之前生成的 KeyPair 的私钥解密获取 Secret
  6. 客户端拿到 AES Secret ,与服务器使用 AES Secret 进行加密通信