You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

319 lines
6.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 接口加密功能改造日志
## 📅 改造日期
2025-12-10
## 🎯 改造目标
参考 `stm32-iot-vben5` 项目的加密实现,为 UniApp 项目添加接口加密功能,支持 RSA + AES 混合加密方案。
---
## 📝 改造内容
### 1. 新增文件
#### ✅ `utils/crypto.js`
**用途:** 加密工具类
**功能:**
- `randomStr(length)` - 生成随机字符串
- `encodeBase64(str)` - Base64 编码
- `decodeBase64(str)` - Base64 解码
- `RsaEncryption` - RSA 加密/解密类
- `AesEncryption` - AES 加密/解密类
**依赖:**
- `crypto-js` - AES 加密
- `jsencrypt` - RSA 加密
#### ✅ 文档文件
| 文件名 | 用途 |
|--------|------|
| `ENCRYPT_GUIDE.md` | 完整的加密功能使用指南 |
| `INSTALL_DEPENDENCIES.md` | 依赖安装说明 |
| `QUICK_START.md` | 5分钟快速开始指南 |
| `api/login.encrypt.example.js` | 接口加密示例代码 |
| `CHANGELOG_ENCRYPTION.md` | 本文件 |
### 2. 修改文件
#### ✅ `config.js`
**新增配置项:**
```javascript
{
clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e', // 客户端ID
enableEncrypt: false, // 全局加密开关
rsaPublicKey: '...', // RSA公钥
rsaPrivateKey: '' // RSA私钥
}
```
#### ✅ `utils/request.js`
**主要改动:**
1. **导入加密工具**
```javascript
import {
RsaEncryption,
AesEncryption,
randomStr,
encodeBase64,
decodeBase64
} from '@/utils/crypto'
```
2. **初始化加密实例**
```javascript
const asymmetricEncryption = new RsaEncryption({
publicKey: rsaPublicKey,
privateKey: rsaPrivateKey
})
const symmetricEncryption = new AesEncryption()
```
3. **请求拦截器增强**
- 添加 `ClientID` 请求头
- 检测 `encrypt: true` 配置
- 生成随机 AES 密钥
- 使用 RSA 加密 AES 密钥
- 使用 AES 加密请求数据
4. **响应拦截器增强**
- 检测响应头 `encrypt-key`
- 使用 RSA 解密 AES 密钥
- 使用 AES 解密响应数据
- 异常处理和错误提示
---
## 🔄 加密流程
### 请求加密流程
```
1. 判断是否需要加密
2. 生成 32 位随机 AES 密钥
3. Base64 编码 AES 密钥
4. RSA 加密 Base64 密钥 → 请求头 encrypt-key
5. AES 加密请求数据 → 请求体
6. 发送请求
```
### 响应解密流程
```
1. 检查响应头 encrypt-key
2. RSA 解密得到 Base64 密钥
3. Base64 解码得到 AES 密钥
4. AES 解密响应数据
5. JSON 解析返回数据
```
---
## 🆚 对比参考项目
### 相同点
| 特性 | stm32-iot-vben5 | stm32-iot-app |
|------|-----------------|---------------|
| 加密算法 | RSA + AES | RSA + AES |
| 加密开关 | enableEncrypt | enableEncrypt |
| 密钥配置 | rsaPublicKey | rsaPublicKey |
| 请求头 | encrypt-key | encrypt-key |
| 客户端ID | ClientID | ClientID |
| 加密方法 | POST/PUT | POST/PUT |
### 差异点
| 项目 | 框架 | 请求库 | 语言 |
|------|------|--------|------|
| stm32-iot-vben5 | Vue 3 + Vite | axios | TypeScript |
| stm32-iot-app | UniApp | uni.request | JavaScript |
---
## 📦 依赖要求
### 必需安装
```json
{
"dependencies": {
"crypto-js": "^4.2.0",
"jsencrypt": "^3.3.2"
}
}
```
### 安装命令
```bash
npm install crypto-js jsencrypt
```
---
## 🎯 使用方式
### 方式一:单个接口启用
```javascript
export function login(data) {
return request({
url: '/login',
method: 'post',
data: data,
encrypt: true // 启用加密
})
}
```
### 方式二:全局启用
```javascript
// config.js
export default {
enableEncrypt: true, // 全局开启
// ...
}
// api 文件中标记需要加密的接口
export function sensitiveApi(data) {
return request({
url: '/api/sensitive',
method: 'post',
data: data,
encrypt: true // 需要加密
})
}
```
---
## ⚠️ 注意事项
### 1. 加密限制
- ✅ 仅支持 POST/PUT 请求
- ❌ GET/DELETE 请求不支持加密
### 2. 配置要求
- 必须配置正确的 RSA 公钥
- 公钥必须与后端保持一致
- clientId 与后端保持一致
### 3. 兼容性
- H5 端完全支持 ✅
- App 端完全支持 ✅
- 小程序端需测试 ⚠️
### 4. 性能影响
- 加密操作增加约 50-100ms 延迟
- 建议仅对敏感接口启用
- 不建议对所有接口启用
---
## 🐛 已知问题
### 1. 小程序兼容性
**问题:** 某些小程序平台可能不支持 crypto-js/jsencrypt
**解决方案:**
- 使用小程序原生加密 API
- 使用 uni-app 插件市场的加密插件
- 小程序端关闭加密
### 2. 响应头大小写
**问题:** 不同平台返回的响应头可能是 `header``headers`
**解决方案:**
```javascript
const encryptKey = (res.header || res.headers || {})['encrypt-key']
```
---
## ✅ 测试清单
### 功能测试
- [ ] POST 请求加密成功
- [ ] PUT 请求加密成功
- [ ] GET 请求正常(不加密)
- [ ] 响应解密成功
- [ ] 错误提示正常
### 平台测试
- [ ] H5 端
- [ ] Android App
- [ ] iOS App
- [ ] 微信小程序
- [ ] 其他小程序
### 异常测试
- [ ] 未安装依赖时的提示
- [ ] 公钥错误时的提示
- [ ] 后端不支持加密时的处理
- [ ] 解密失败时的处理
---
## 📖 参考资料
### 项目参考
- 参考项目:`stm32-iot-vben5/apps/web-antd/src/api/request.ts`
- RuoYi 官方文档http://doc.ruoyi.vip/
### 技术文档
- UniApp 官方文档https://uniapp.dcloud.net.cn/
- crypto-jshttps://github.com/brix/crypto-js
- jsencrypthttps://github.com/travist/jsencrypt
---
## 🔮 未来优化
### 计划中
1. 支持 SM2/SM4 国密算法
2. 支持小程序原生加密方案
3. 添加自动化测试
4. 性能优化(密钥缓存)
### 待评估
1. 支持更多加密算法
2. 支持请求签名验证
3. 支持加密日志脱敏
---
## 👨‍💻 贡献者
- 主要开发AI Assistant
- 参考项目stm32-iot-vben5
- 技术支持RuoYi 开源社区
---
## 📄 许可证
本改造遵循原项目许可证。
---
**改造完成日期:** 2025-12-10
**文档版本:** 1.0.0