# crypto-sdk
**Repository Path**: mapleKirito/crypto-sdk
## Basic Information
- **Project Name**: crypto-sdk
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-05-11
- **Last Updated**: 2026-05-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Crypto SDK - API加解密SDK
## 项目简介
一套完整的API接口加解密解决方案,专为JDK 8业务系统设计,支持零侵入式集成。
### 核心特性
- **JDK 8完全兼容**
- **零侵入**:只需添加 `@ApiCrypto` 注解即可启用加解密
- **RSA + AES 混合加密**:安全高效
- **防重放攻击**:时间戳 + Nonce 验证
- **防篡改**:HMAC-SHA256 签名验证
- **Spring Boot 自动配置**
- **高兼容性**:支持统一响应包装类(R、Result等)
---
## 快速开始
### 1. 安装到本地Maven仓库
```bash
cd crypto-sdk
mvn clean install
```
### 2. 业务系统添加依赖
```xml
com.ai.extender
crypto-sdk
1.1.1
```
### 3. 生成密钥
```bash
# Windows
scripts\generate-keys.bat
# Linux/Mac
chmod +x scripts/generate-keys.sh
./scripts/generate-keys.sh
# Python(推荐,跨平台)
pip install cryptography
python scripts/generate-keys.py
```
### 4. 配置密钥
```yaml
crypto:
enabled: true
key:
# 公钥:用于加密数据(Base64编码,单行)
public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
# 私钥:用于解密数据(Base64编码,单行)
private-key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQ...
auto-generate: false
signature:
enabled: true
secret:
timestamp-validity: 300000
```
> **注意**:密钥建议使用单行写法,避免 `|` 多行写法带来的换行符问题。
### 5. 使用注解
```java
@RestController
@RequestMapping("/api/order")
public class OrderController {
@PostMapping("/create")
@ApiCrypto // 自动加解密
public R createOrder(@RequestBody OrderRequest request) {
return R.ok(orderService.create(request));
}
}
```
---
## 配置说明
### 完整配置项
```yaml
crypto:
# 全局开关
enabled: true
# RSA密钥配置
# 使用原则:公钥加密,私钥解密
key:
public-key:
private-key:
auto-generate: false # 生产环境必须false
# 签名配置(防重放、防篡改)
signature:
enabled: true
secret: <至少32字符的密钥>
timestamp-validity: 300000 # 5分钟
```
### 密钥配置灵活性
| 配置方式 | 说明 | 适用场景 |
|----------|------|----------|
| **共用一套密钥** | 公钥和私钥是一对 | 内网通信、可信环境 |
| **各自密钥** | 私钥是自己的,公钥是对方的 | 高安全要求、需要身份认证 |
---
## 注解说明
### @ApiCrypto
```java
@ApiCrypto(
encryptRequest = true, // 解密请求(默认true)
encryptResponse = true // 加密响应(默认true)
)
```
### 组合效果
| encryptRequest | encryptResponse | 效果 |
|----------------|-----------------|------|
| `true` | `true` | 请求解密 + 响应加密 + 安全验证 ✅ |
| `true` | `false` | 请求解密 + 响应明文 + 安全验证 |
| `false` | `true` | 请求明文 + 响应加密 + 安全验证 |
| `false` | `false` | 请求明文 + 响应明文 + 安全验证 |
> **注意**:只要加了 `@ApiCrypto` 注解,安全验证(防重放、防篡改)始终生效。
---
## 加密原理
### RSA+AES 混合加密
```
加密流程:
1. 生成随机 AES 密钥(256位)
2. 生成随机 IV(96位)
3. AES-GCM 加密数据
4. RSA 公钥加密 AES 密钥
5. 返回:IV + 密文 + 加密的AES密钥
解密流程:
1. RSA 私钥解密得到 AES 密钥
2. 分离 IV 和密文
3. AES-GCM 解密数据
```
### IV 的作用
IV(初始化向量)让相同的明文每次加密产生不同的密文,防止攻击者通过分析密文模式推断明文。
---
## 安全机制
### 防重放攻击
请求头必须包含:
- `X-Timestamp`:时间戳(毫秒)
- `X-Nonce`:随机字符串
服务端验证:
- 时间戳有效期:默认5分钟
- Nonce 缓存:防止同一请求重复使用
### 防篡改
请求头包含:
- `X-Signature`:HMAC-SHA256 签名
签名内容:`请求体|时间戳|Nonce`
---
## 项目结构
```
crypto-sdk/
├── pom.xml
├── README.md
├── scripts/
│ ├── generate-keys.py # Python密钥生成工具(推荐)
│ ├── generate-keys.bat # Windows密钥生成工具
│ ├── generate-keys.sh # Linux/Mac密钥生成工具
│ ├── install-local.bat # Windows安装脚本
│ └── install-local.sh # Linux/Mac安装脚本
├── src/main/java/com/ai/extender/crypto/
│ ├── annotation/
│ │ ├── ApiCrypto.java
│ │ └── CryptoMode.java
│ ├── advice/
│ │ ├── CryptoRequestBodyAdvice.java # 请求解密+安全验证
│ │ └── CryptoResponseBodyAdvice.java # 响应加密
│ ├── aspect/
│ │ └── CryptoAspect.java # 工具方法
│ ├── config/
│ │ ├── CryptoProperties.java
│ │ └── CryptoAutoConfiguration.java
│ └── util/
│ ├── AESUtil.java
│ ├── RSAUtil.java
│ ├── HybridCryptoUtil.java
│ └── SignatureUtil.java
├── src/main/resources/
│ ├── META-INF/spring.factories
│ └── application-crypto-example.yml
└── examples/
├── client-java/ # Java后端调用方示例
└── client-vue/ # Vue前端调用方示例
```
---
## 调用方集成
### Java后端调用方
```java
// 配置 RestTemplate
@Bean
public RestTemplate cryptoRestTemplate() {
RestTemplate rt = new RestTemplate();
rt.getInterceptors().add(new CryptoRequestInterceptor(props));
return rt;
}
// 调用加密接口
Order result = cryptoRestTemplate.postForObject(url, request, Order.class);
```
### Vue前端调用方
```typescript
// 安装依赖
npm install jsencrypt@3.0.0-beta.1 crypto-js
// 配置 Axios
CryptoAxiosPlugin.install(axios, {
serverPublicKey: '...',
clientPrivateKey: '...',
signatureSecret: '...'
})
// 调用加密接口
const result = await cryptoAxios.post('/api/order/create', data)
```
---
## 兼容性说明
### v1.1.0 解决的问题
第三方项目使用统一响应包装类(如 `R`、`Result`)时,原AOP切面会导致类型转换异常。
### 解决方案
使用 `ResponseBodyAdvice` 和 `RequestBodyAdvice` 替代 AOP 切面:
| 组件 | 职责 |
|------|------|
| `CryptoRequestBodyAdvice` | 请求体解密 + 安全验证 |
| `CryptoResponseBodyAdvice` | 响应体加密 |
**优势**:在消息转换器层面介入,不改变返回类型,完美兼容统一响应包装类。
---
## 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| 1.1.1 | 2026-05-11 | 修复异常类型:将安全验证异常改为 IllegalArgumentException,由业务系统全局异常处理器统一处理 |
| 1.1.0 | 2026-05-09 | 引入 ResponseBodyAdvice 解决兼容性问题;简化加密模式为 RSA+AES 混合;新增调用方示例 |
| 1.0.0 | 2026-05-08 | 初始版本 |
---
## 依赖说明
```xml
org.springframework.boot
spring-boot-starter-web
```
---
**最后更新**: 2026-05-09