# mx-encrypt-spring-boot-starter
**Repository Path**: lwq_gitee_com/mx-encrypt-spring-boot-starter
## Basic Information
- **Project Name**: mx-encrypt-spring-boot-starter
- **Description**: 数据传输加密、完整性校验、防篡改、防重放
新增RSA_SIGN_AND_AES签名方式,即【数字签名】和【数字信封】
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-05-28
- **Last Updated**: 2025-11-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mx-encrypt-spring-boot-starter
基于 [https://gitee.com/itxinmeng/mx-encrypt-spring-boot-starter](https://gitee.com/itxinmeng/mx-encrypt-spring-boot-starter) 修改,遵循 Apache License 2.0。
**mx-encrypt-spring-boot-starter** 是一个 Spring Boot Starter,用于实现数据传输加密、完整性校验、防篡改和防重放攻击。新增了 `RSA_SIGN_AND_AES` 签名方式,结合了【数据签名】和【数字信封】机制。
---
## 1. 功能特性
- **数据加密**:支持 AES 和 RSA 加密算法。
- **签名机制**:支持 RSA 签名,确保数据完整性。
- **防篡改**:通过签名验证防止数据被篡改。
- **防重放攻击**:设置时间窗口防止请求重放。
- **自动配置**:Spring Boot 自动配置,开箱即用。
---
## 2. 使用方法
### 构建项目
```bash
mvn clean install
```
### 引入依赖
在 `pom.xml` 中添加以下依赖:
```xml
io.gitee.lwq
mx-encrypt-spring-boot-starter
1.1.9
```
### 配置加密方式
在 `application.yml` 或 `application.properties` 中配置 `RSA_SIGN_AND_AES` 签名方式:
```yaml
custom:
encrypt:
method: RSA_SIGN_AND_AES
privateKey: MIICdgIBADANB==
publicKey: MIGfMA0G
clientPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4G
replayWindowMs: 500 # 防重放时间窗口(毫秒)
```
| 配置项 | 说明 | 是否必须 |
|--------|------|----------|
| `method` | 加密方式(`RSA_SIGN_AND_AES`) | 是 |
| `privateKey` | 服务端私钥 | 是 |
| `publicKey` | 服务端公钥 | 是 |
| `clientPublicKey` | 客户端公钥 | 是 |
| `serviceKey` | 服务端标识 | 否,默认 `serviceKey` |
| `replayWindowMs` | 防重放时间窗口(毫秒) | 否,默认 `500` |
---
## 3. 使用示例
### 服务端代码
使用 `@Encrypt` 和 `@Decrypt` 注解对请求和响应进行加密/解密:
```java
@Encrypt
@Decrypt
@PostMapping("/test")
public Object test(@RequestBody ReqModel reqModel) {
log.info(JSONUtil.toJsonStr(reqModel));
reqModel.getModel().setUpdateTime(new Date());
reqModel.getModel().setUpdateName("serviceUpdate");
return reqModel;
}
```
---
### 客户端请求
使用 `curl` 发送加密请求:
```bash
curl --location --request POST 'http://localhost:9003/liao/test' \
--header 'encryptSecret: cIOMZ77xvqRCFmOszIBjoC2lrYFRNeI1WFyFxljW7RcaySLOfKlxFtydzRlY4IscnJVpFSpzBnSmW+ti7vfiaeGxi0zk7Uyo8DIjYg3SGRUbYijfgb+C4u8y6quLxlQz50HWUdepTJD7g0eWlemYG7Vq1lo0NhRFChXR2DMKrac=' \
--header 'sign: yxRiRaqnKjVqNbmJb8RSoNp0xtFzXyBrSw9BfIgbmMCtlxPyvQs5cSqufkTe9iThMfUZk/iMsOhmF2nYOxrmgVhdwDFL7+UfOjO1ZwOm+EQatZYxiRYdOCvDe+cdVl3UlRmGzBMcSiU1DPTGQFp0S9gEjaHtPGlt9gmkAG9ZU47M9HSnilMvJU1pfRV+YHmTwRwPOdM0/i11QeRjetBDrUGhUbcgRuLiUPY5gKOA6aqPAl94Hg+DCGcTTBoWM6cekKDbzXb8fe5CV3mWULFh2YU8D2GtT5bqFf8aNDSj4BZQc0vmFhh05hyOTIgm1273nnxx0BtLiJmVJOQg03i3Cw==' \
--header 'appKey: appKey' \
--header 'version: v1' \
--header 'timestamp: 1748501895298' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: localhost:9003' \
--header 'Connection: keep-alive' \
--data-raw 'gcAsk1l4wnNdJY9EE1hXt90ONxfBSyUZx6dihd1qmoO3PIyGzJUM75I3uTXAuMwi51mNWNFYWRAqUgQtsbo4+1MEGg55L+7wzeXeuBAXPI3h/C0EcqTPQ7zCYG4NVXcuoGhbdcSDbtffjizeojMbTPSggXRERo3YyzAV9VxYWKUl5mN5cvJYwS6n9ABKJl71'
```
| 请求头 | 说明 | 是否必须 |
|--------|------|----------|
| `encryptSecret` | 经过 RSA 加密后的 AES 密钥 | 是 |
| `appKey` | 客户端标识 | 是 |
| `version` | 加密版本号 | 是 |
| `timestamp` | UTC 毫秒时间戳 | 是 |
| `sign` | RSA 签名 | 是 |
| `body` | AES 加密后的请求体 | 是 |
---
### 服务端响应
服务端返回的响应格式如下:
```json
{
"encryptContent": "qecy7zEPm6sW6GS9JBFneBxWG41LlCJwcRISH7jikQ2nRVfS/xiy3o5myZpoeMUIOQiBQ+Uqtl/iPdCMRRjkq3Uuwbw1SlCUiZaTIl0RKZNiUqHyvvRAbFVMgcskhiShWsEaRhAC13ovoFCxtAOdIO/7ShPTylP9Tc3FrdLKYZIrpjSeU6xLKJynEqj/utGR2qjvZqwn2lbEFuLbJPqI8w==",
"sign": "Zio8mxpxim/JOkIbCinof5uKVLi7S8+kXDeqJAvHYO4Jk1f7Yn2E31xehSxTLZI7cmLydV/jsBJibmhTavRvgiNSgmqNtbNdiak9uxbPXvYr4qvx3gFTNUthNmNYvrHeJ9sHYjDWqgjMdk4axCI1+m3RZOhdi9FIALNaZjBih5iWH36q+d0zhhesPEfLphBAg13B8nBgDqeeSGqqJsIz/S9T9F4/UfFOto/HONFBS7GLszgysSrRrlBfXD9G+HX6mgKu62Al+Ho5bGkETyGeC2sAO3PGl6Sm+lDsNN6h1V3AAOkAA2xZGV0jEhD3ntChiji8H9O1t0xsToMzoQLLqQ==",
"serviceKey": "serviceKey",
"version": "v1",
"encryptSecret": "bMTh67WizI9SmuTbhFlGbjvpLgOPoppVnLTiuQYXchNNbWxqTkyXMxDfFrXCZTXEELSs6Jrs5EcdIonq5WbXJg/mzuA5kmOPVJPZsY2wBbARr78qa6TWJeH6s7E8L9SZyYwC/YPYV0H0cylCwNe97F5FnSPGa40Jpz4mEEF8wsk=",
"timestamp": 1748502156250
}
```
| 响应字段 | 说明 | 是否必须 |
|----------|------|----------|
| `encryptSecret` | 经过 RSA 加密后的 AES 密钥 | 是 |
| `serviceKey` | 服务端标识 | 是 |
| `version` | 加密版本号 | 是 |
| `timestamp` | UTC 毫秒时间戳 | 是 |
| `sign` | RSA 签名 | 是 |
| `encryptContent` | AES 加密后的响应体 | 是 |
---
## 4. 客户端工具类
客户端可以使用 `RsaSignAndAesEncryptClientUtil` 工具类进行加密和解密操作。
```java
public class RsaSignAndAesEncryptClientUtil {
public static Map buildAppSendParam(String appContent) { ... }
public static String decryptServiceBody(Map appSendParam) { ... }
public static RSA getClientRsa() { ... }
public static RSA getServiceRsa() { ... }
}
```
---
## 5. 许可证
本项目遵循 [Apache License 2.0](LICENSE)。