最近接手的一个项目中,要求前后端通信时,所有的信息都要加密传送。这里把加密的要点简单整理一下。
注意,加密算法和加密过程有很多种,以下内容仅是本人项目中采用的方案。
加密算法
加密算法采用AES和RSA。
- AES是对称加密方法,加密方和解密方需要同时知道密钥是什么。
- RSA是非对称加密算法,RSA通常会先生成一个公钥和一个私钥;公钥不值钱,可以随便给人;私钥要保管好,不能随便泄漏。
加密过程
这里先不说实际的方案,先来简单推演一下过程。
假设我们现在只使用AES算法,是否可以满足需求呢?前后端使用相同的密钥,请求时加密,后端接到数据时解密。貌似也是可以的。但是实际上如果这样实现,跟不加密区别不大。为什么呢?主要的问题是前端的代码是要写在javascript里边的。浏览器直接查看源代码,密钥直接就会被看到,这样的加密形同虚设。
我们再改进一下。
为了不让AES的密钥出现在代码里,我们可以每次发送请求时,新生成一个随机的密钥,这样就不用担心被人看到了。但是另外一个问题也来了,前端每次请求都生成一个随机的密钥,后端怎么知道呢?答案是,请求时把密钥一起送过去。当然了,这个密钥不能明目张胆的送,得再包装一下。
怎么包装呢?这就需要用到RSA加密算法了。RSA的特点是,用公钥加密后的内容,只能用私钥进行解密。公钥相当于一个锁,私钥相当于钥匙。上边说的"公钥不值钱"就是这个原因,你拿了公钥也没有用,你只能加密要发送的数据,不能看接收到的数据。
好了,过程基本就是这样了:
- 前端生成AES随机密钥,加密要发送的数据;
- 用后端给的RSA的公钥对这个随机的AES私钥加密,请求时同时发送。
- 后端收到数据以后,先用RSA的私钥拿到AES的密钥
- 用AES密钥解密数据。
应答的时候,比这个过程就简单多了。因为现在前后端已经都知道AES的密钥了。后端用AES加密,前端解密就可以了。
实际上,以上过程还是不安全的,无法解决中间人攻击的问题。这个问题以后有时间再整理吧。