对称加密是指加密和解密使用同一个密钥的加密方式。发送方使用密钥将明文数据加密成密文,然后发送出去,接收方收到密文后,使用同一个密钥将密文解密成明文读取。
对称加密具有加密计算量小、速度块的优点,适合对大量数据进行加密的场景。
由于对称加密的加密和解密使用的是同一个密钥,因此密钥的传输问题、保存问题是对称加密的两大缺点。
非对称加密是指需要用一对密钥,即公钥和私钥,来完成加解密的方式。如果用公钥加密,则只能用对应的私钥才能解密;而如果用私钥加密,则只能用对应的公钥才能解密。
非对称加密解决了对称加密的两大不足:密钥传输问题和密钥管理问题。
非对称加密的缺点在于加密计算量大、速度慢,因此适合对少量数据进行加密的场景。
由于两种加密方式各有优劣,一般实际应用时扬长避短,使用对称加密法加密报文,使用非对称加密法加密对称加密的密钥。
AES是常用的对称加密算法,RSA是常用的非对称加密算法。
- 服务端生成RSA公钥(publicKey)、私钥(privateKey).
- 客户端生成AES密钥(aesKey),使用AES将报文加密成密文(data).
- 客户端获取publicKey,使用RSA对aesKey加密(encryptKey).
- 客户端将data和encryptKey作为参数传给服务端.
- 因为从客户端传来的aesKey是安全的,所以服务端直接用aesKey加密返回报文,将密文返回即可.
因为要对接口入参、出参进行加解密,所以要对接口进行拦截。
在Spring-Boot框架下,常用的拦截方法有AOP、过滤器等。
此项目包含:
- 注解+AOP
- 过滤器
首先自定义注解@Decrypt、@Encrypt,分别对应对请求入参解密、对返回结果加密操作。
然后AOP扫描指定包下的Controller,拦截带自定义标签的Post请求,进行入参解密、出参加密操作。
详见代码 ./src/main/java/cn/example/web/demo/security/SecurityAspect.java
待完善