|
|
|
|
|
# 🔐 接口加密功能说明
|
|
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
|
|
本项目已集成 **RSA + AES 混合加密方案**,参考 `stm32-iot-vben5` 项目实现,为 UniApp 应用提供完整的接口加密能力。
|
|
|
|
|
|
|
|
|
|
|
|
## 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
### 1️⃣ 安装依赖
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm install crypto-js jsencrypt
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2️⃣ 配置密钥
|
|
|
|
|
|
|
|
|
|
|
|
编辑 `config.js`:
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
export default {
|
|
|
|
|
|
enableEncrypt: true, // 开启加密
|
|
|
|
|
|
rsaPublicKey: `YOUR_PUBLIC_KEY`, // 配置公钥
|
|
|
|
|
|
// ...
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3️⃣ 使用加密
|
|
|
|
|
|
|
|
|
|
|
|
在 API 调用中添加 `encrypt: true`:
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
export function login(data) {
|
|
|
|
|
|
return request({
|
|
|
|
|
|
url: '/login',
|
|
|
|
|
|
method: 'post',
|
|
|
|
|
|
data: data,
|
|
|
|
|
|
encrypt: true // ⭐ 启用加密
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📚 完整文档
|
|
|
|
|
|
|
|
|
|
|
|
| 文档 | 说明 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| [QUICK_START.md](./QUICK_START.md) | 5分钟快速配置指南 |
|
|
|
|
|
|
| [ENCRYPT_GUIDE.md](./ENCRYPT_GUIDE.md) | 详细使用文档 |
|
|
|
|
|
|
| [INSTALL_DEPENDENCIES.md](./INSTALL_DEPENDENCIES.md) | 依赖安装说明 |
|
|
|
|
|
|
| [CHANGELOG_ENCRYPTION.md](./CHANGELOG_ENCRYPTION.md) | 改造日志 |
|
|
|
|
|
|
| [api/login.encrypt.example.js](./api/login.encrypt.example.js) | 代码示例 |
|
|
|
|
|
|
|
|
|
|
|
|
## 🔑 核心特性
|
|
|
|
|
|
|
|
|
|
|
|
- ✅ **RSA 非对称加密**:安全传输 AES 密钥
|
|
|
|
|
|
- ✅ **AES 对称加密**:高效加密请求/响应数据
|
|
|
|
|
|
- ✅ **自动加密/解密**:对业务代码无侵入
|
|
|
|
|
|
- ✅ **灵活配置**:支持全局/单个接口启用
|
|
|
|
|
|
- ✅ **完善的错误处理**:加密失败有明确提示
|
|
|
|
|
|
|
|
|
|
|
|
## 🎯 适用场景
|
|
|
|
|
|
|
|
|
|
|
|
推荐对以下接口启用加密:
|
|
|
|
|
|
|
|
|
|
|
|
- 🔐 登录/注册
|
|
|
|
|
|
- 🔑 密码修改
|
|
|
|
|
|
- 👤 个人信息修改
|
|
|
|
|
|
- 💳 支付相关
|
|
|
|
|
|
- 🔒 敏感数据传输
|
|
|
|
|
|
|
|
|
|
|
|
## 📁 文件结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
stm32-iot-app/
|
|
|
|
|
|
├── utils/
|
|
|
|
|
|
│ ├── request.js ✅ 已改造(支持加密)
|
|
|
|
|
|
│ └── crypto.js ✅ 加密工具类
|
|
|
|
|
|
├── config.js ✅ 加密配置
|
|
|
|
|
|
├── api/
|
|
|
|
|
|
│ └── login.encrypt.example.js 示例代码
|
|
|
|
|
|
├── QUICK_START.md 快速开始
|
|
|
|
|
|
├── ENCRYPT_GUIDE.md 详细指南
|
|
|
|
|
|
└── INSTALL_DEPENDENCIES.md 安装说明
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## ⚙️ 配置说明
|
|
|
|
|
|
|
|
|
|
|
|
### config.js
|
|
|
|
|
|
|
|
|
|
|
|
| 配置项 | 类型 | 说明 | 默认值 |
|
|
|
|
|
|
|--------|------|------|--------|
|
|
|
|
|
|
| `clientId` | String | 客户端标识 | `e5cd7e...` |
|
|
|
|
|
|
| `enableEncrypt` | Boolean | 全局加密开关 | `false` |
|
|
|
|
|
|
| `rsaPublicKey` | String | RSA 公钥 | 示例密钥 |
|
|
|
|
|
|
| `rsaPrivateKey` | String | RSA 私钥 | `''` |
|
|
|
|
|
|
|
|
|
|
|
|
### 请求配置
|
|
|
|
|
|
|
|
|
|
|
|
| 参数 | 类型 | 说明 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| `encrypt` | Boolean | 是否加密此请求 |
|
|
|
|
|
|
|
|
|
|
|
|
## 🔄 加密流程
|
|
|
|
|
|
|
|
|
|
|
|
### 请求流程
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
生成 AES 密钥 → RSA 加密密钥 → AES 加密数据 → 发送请求
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 响应流程
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
接收响应 → RSA 解密密钥 → AES 解密数据 → 返回结果
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📱 平台支持
|
|
|
|
|
|
|
|
|
|
|
|
| 平台 | 支持情况 |
|
|
|
|
|
|
|------|---------|
|
|
|
|
|
|
| H5 | ✅ 完全支持 |
|
|
|
|
|
|
| App (iOS/Android) | ✅ 完全支持 |
|
|
|
|
|
|
| 微信小程序 | ⚠️ 需测试 |
|
|
|
|
|
|
| 其他小程序 | ⚠️ 需测试 |
|
|
|
|
|
|
|
|
|
|
|
|
## ⚠️ 注意事项
|
|
|
|
|
|
|
|
|
|
|
|
1. **仅支持 POST/PUT 请求加密**
|
|
|
|
|
|
2. **公钥必须与后端一致**
|
|
|
|
|
|
3. **小程序端可能需要额外配置**
|
|
|
|
|
|
4. **加密会增加少量性能开销**
|
|
|
|
|
|
|
|
|
|
|
|
## 🐛 故障排除
|
|
|
|
|
|
|
|
|
|
|
|
### 找不到模块?
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm install crypto-js jsencrypt
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 数据解密失败?
|
|
|
|
|
|
检查:
|
|
|
|
|
|
1. 公钥是否正确
|
|
|
|
|
|
2. 后端是否支持加密
|
|
|
|
|
|
3. enableEncrypt 是否为 true
|
|
|
|
|
|
|
|
|
|
|
|
### 小程序不兼容?
|
|
|
|
|
|
参考 [INSTALL_DEPENDENCIES.md](./INSTALL_DEPENDENCIES.md) 中的替代方案
|
|
|
|
|
|
|
|
|
|
|
|
## 📖 示例代码
|
|
|
|
|
|
|
|
|
|
|
|
### 基础使用
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
import request from '@/utils/request'
|
|
|
|
|
|
|
|
|
|
|
|
// 启用加密
|
|
|
|
|
|
export function sensitiveApi(data) {
|
|
|
|
|
|
return request({
|
|
|
|
|
|
url: '/api/sensitive',
|
|
|
|
|
|
method: 'post',
|
|
|
|
|
|
data: data,
|
|
|
|
|
|
encrypt: true // 启用
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 不加密
|
|
|
|
|
|
export function normalApi(params) {
|
|
|
|
|
|
return request({
|
|
|
|
|
|
url: '/api/normal',
|
|
|
|
|
|
method: 'get',
|
|
|
|
|
|
params: params // GET 请求不支持加密
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 条件加密
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// 根据环境决定是否加密
|
|
|
|
|
|
const isDev = process.env.NODE_ENV === 'development'
|
|
|
|
|
|
|
|
|
|
|
|
export function login(data) {
|
|
|
|
|
|
return request({
|
|
|
|
|
|
url: '/login',
|
|
|
|
|
|
method: 'post',
|
|
|
|
|
|
data: data,
|
|
|
|
|
|
encrypt: !isDev // 生产环境加密,开发环境不加密
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔗 相关链接
|
|
|
|
|
|
|
|
|
|
|
|
- RuoYi 官方文档:http://doc.ruoyi.vip/
|
|
|
|
|
|
- UniApp 文档:https://uniapp.dcloud.net.cn/
|
|
|
|
|
|
- crypto-js:https://github.com/brix/crypto-js
|
|
|
|
|
|
- jsencrypt:https://github.com/travist/jsencrypt
|
|
|
|
|
|
|
|
|
|
|
|
## 📞 技术支持
|
|
|
|
|
|
|
|
|
|
|
|
如有问题,请:
|
|
|
|
|
|
1. 查看上述文档
|
|
|
|
|
|
2. 检查控制台日志
|
|
|
|
|
|
3. 联系项目负责人
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
**最后更新:** 2025-12-10
|
|
|
|
|
|
**版本:** 1.0.0
|