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.
6.1 KiB
6.1 KiB
接口加密功能改造日志
📅 改造日期
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
新增配置项:
{
clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e', // 客户端ID
enableEncrypt: false, // 全局加密开关
rsaPublicKey: '...', // RSA公钥
rsaPrivateKey: '' // RSA私钥
}
✅ utils/request.js
主要改动:
-
导入加密工具
import { RsaEncryption, AesEncryption, randomStr, encodeBase64, decodeBase64 } from '@/utils/crypto' -
初始化加密实例
const asymmetricEncryption = new RsaEncryption({ publicKey: rsaPublicKey, privateKey: rsaPrivateKey }) const symmetricEncryption = new AesEncryption() -
请求拦截器增强
- 添加
ClientID请求头 - 检测
encrypt: true配置 - 生成随机 AES 密钥
- 使用 RSA 加密 AES 密钥
- 使用 AES 加密请求数据
- 添加
-
响应拦截器增强
- 检测响应头
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 |
📦 依赖要求
必需安装
{
"dependencies": {
"crypto-js": "^4.2.0",
"jsencrypt": "^3.3.2"
}
}
安装命令
npm install crypto-js jsencrypt
🎯 使用方式
方式一:单个接口启用
export function login(data) {
return request({
url: '/login',
method: 'post',
data: data,
encrypt: true // 启用加密
})
}
方式二:全局启用
// 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
解决方案:
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-js:https://github.com/brix/crypto-js
- jsencrypt:https://github.com/travist/jsencrypt
🔮 未来优化
计划中
- 支持 SM2/SM4 国密算法
- 支持小程序原生加密方案
- 添加自动化测试
- 性能优化(密钥缓存)
待评估
- 支持更多加密算法
- 支持请求签名验证
- 支持加密日志脱敏
👨💻 贡献者
- 主要开发:AI Assistant
- 参考项目:stm32-iot-vben5
- 技术支持:RuoYi 开源社区
📄 许可证
本改造遵循原项目许可证。
改造完成日期: 2025-12-10
文档版本: 1.0.0