# 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)。