# aes-rsa-java-springboot
**Repository Path**: nemo77/aes-rsa-java-springboot
## Basic Information
- **Project Name**: aes-rsa-java-springboot
- **Description**: AES-RSA整合Spring-Boot对接口入参出参加密的demo. An AES-RSA Spring-Boot demo.
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2022-03-04
- **Last Updated**: 2023-08-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## AES+RSA结合应用Java Spring-Boot示例
### 介绍
#### 对称加密
对称加密是指加密和解密使用同一个密钥的加密方式。发送方使用密钥将明文数据加密成密文,然后发送出去,接收方收到密文后,使用同一个密钥将密文解密成明文读取。
对称加密具有加密计算量小、速度块的优点,适合对大量数据进行加密的场景。
由于对称加密的加密和解密使用的是同一个密钥,因此密钥的传输问题、保存问题是对称加密的两大缺点。
#### 非对称加密
非对称加密是指需要用一对密钥,即公钥和私钥,来完成加解密的方式。如果用公钥加密,则只能用对应的私钥才能解密;而如果用私钥加密,则只能用对应的公钥才能解密。
非对称加密解决了对称加密的两大不足:密钥传输问题和密钥管理问题。
非对称加密的缺点在于加密计算量大、速度慢,因此适合对少量数据进行加密的场景。
#### 实际应用
由于两种加密方式各有优劣,一般实际应用时扬长避短,使用对称加密法加密报文,使用非对称加密法加密对称加密的密钥。
AES是常用的对称加密算法,RSA是常用的非对称加密算法。
### 加解密流程
#### 客户端到服务端
1. 服务端生成RSA公钥(publicKey)、私钥(privateKey).
2. 客户端生成AES密钥(aesKey),使用AES将报文加密成密文(data).
3. 客户端获取publicKey,使用RSA对aesKey加密(encryptKey).
4. 客户端将data和encryptKey作为参数传给服务端.
#### 服务端返回结果给客户端
1. 因为从客户端传来的aesKey是安全的,所以服务端直接用aesKey加密返回报文,将密文返回即可.
### 应用方案
因为要对接口入参、出参进行加解密,所以要对接口进行拦截。
在Spring-Boot框架下,常用的拦截方法有AOP、过滤器等。
此项目包含:
- [x] 注解+AOP
- [ ] 过滤器
#### 注解+AOP
首先自定义注解@Decrypt、@Encrypt,分别对应对请求入参解密、对返回结果加密操作。
然后AOP扫描指定包下的Controller,拦截带自定义标签的Post请求,进行入参解密、出参加密操作。
详见代码 ./src/main/java/cn/example/web/demo/security/SecurityAspect.java
#### 使用过滤器
*待完善*
### 参考文档
1. [网络传输数据加解密方案选择(RSA+AES)](https://blog.csdn.net/yuzhiqiang_1993/article/details/88641265)
2. [对称加密及AES加密算法](https://www.jianshu.com/p/3840b344b27c)
3. [非对称加密及RSA加密算法](https://www.jianshu.com/p/9785bd492a6e)