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.
5.3 KiB
5.3 KiB
接口加密使用指南
简介
本项目已集成接口加密功能,支持 RSA + AES 混合加密方案:
- RSA 非对称加密:用于加密传输 AES 密钥
- AES 对称加密:用于加密实际的请求/响应数据
配置说明
1. 安装依赖
npm install crypto-js jsencrypt
# 或
yarn add crypto-js jsencrypt
2. 配置文件 (config.js)
export default {
baseUrl: 'http://localhost:8080',
clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
// 是否全局启用加密 (设置为 true 时,所有标记了 encrypt: true 的请求都会加密)
enableEncrypt: false,
// RSA 公钥 (用于加密请求)
rsaPublicKey: `YOUR_PUBLIC_KEY_HERE`,
// RSA 私钥 (用于解密响应,一般为空,由后端持有)
rsaPrivateKey: '',
}
重要说明:
enableEncrypt: 全局加密开关,建议生产环境设为true,开发环境设为falsersaPublicKey: 需要替换为实际的 RSA 公钥,与后端保持一致rsaPrivateKey: 前端通常不需要私钥,仅在需要解密响应时使用
3. RSA 密钥对生成
后端项目位置:
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java
确保前后端使用相同的公私钥对。
使用方法
方式一:单个接口启用加密
在调用接口时,添加 encrypt: true 参数:
import request from '@/utils/request'
// POST 请求 - 启用加密
export function login(data) {
return request({
url: '/login',
method: 'post',
data: data,
encrypt: true // 开启加密
})
}
// PUT 请求 - 启用加密
export function updateUser(data) {
return request({
url: '/system/user',
method: 'put',
data: data,
encrypt: true // 开启加密
})
}
// GET 请求 - 不支持加密
export function getUserList(params) {
return request({
url: '/system/user/list',
method: 'get',
params: params
// GET 请求不会被加密,即使设置 encrypt: true
})
}
方式二:全局启用加密
- 修改
config.js:
export default {
enableEncrypt: true, // 全局开启
// ...其他配置
}
- 接口调用:
// 需要加密的接口
export function sensitiveApi(data) {
return request({
url: '/api/sensitive',
method: 'post',
data: data,
encrypt: true // 标记为需要加密
})
}
// 不需要加密的接口
export function normalApi(data) {
return request({
url: '/api/normal',
method: 'post',
data: data
// 不设置 encrypt 参数,不会加密
})
}
加密流程
请求加密流程
- 生成随机 32 位 AES 密钥
- 使用 Base64 编码 AES 密钥
- 使用 RSA 公钥加密 Base64 后的 AES 密钥,放入请求头
encrypt-key - 使用 AES 密钥加密请求数据
- 发送加密后的数据到后端
响应解密流程
- 从响应头获取
encrypt-key - 使用 RSA 私钥解密得到 Base64 编码的 AES 密钥
- Base64 解码得到 AES 密钥
- 使用 AES 密钥解密响应数据
- 返回解密后的数据
注意事项
- 仅支持 POST/PUT 请求加密:GET、DELETE 等请求不支持加密
- Header 参数:
Authorization: Token 认证ClientID: 客户端标识encrypt-key: 加密密钥(仅加密请求时携带)
- 错误处理:如果解密失败,会提示"数据解密失败"并拒绝请求
- 性能影响:加密会增加少量计算开销,建议仅对敏感接口启用
- 密钥安全:
- 不要将 RSA 私钥放在前端
- 确保公钥与后端一致
- 定期更新密钥对
示例代码
登录接口加密
// api/login.js
import request from '@/utils/request'
export function login(username, password) {
const data = {
username,
password
}
return request({
url: '/login',
method: 'post',
data: data,
encrypt: true // 登录信息需要加密
})
}
用户信息修改加密
// api/system/user.js
import request from '@/utils/request'
export function updateUserInfo(data) {
return request({
url: '/system/user/profile',
method: 'put',
data: data,
encrypt: true // 个人信息需要加密
})
}
export function getUserProfile() {
return request({
url: '/system/user/profile',
method: 'get'
// GET 请求不加密
})
}
调试建议
- 开发环境:设置
enableEncrypt: false,方便调试 - 生产环境:设置
enableEncrypt: true,确保数据安全 - 日志输出:加密失败时会在控制台输出错误信息
- 网络抓包:可以通过抓包工具查看加密后的数据
常见问题
Q1: 提示"数据解密失败"?
- 检查 RSA 公私钥是否与后端一致
- 确认后端是否返回了加密响应
- 查看控制台错误日志
Q2: 接口请求失败?
- 检查
enableEncrypt配置是否正确 - 确认接口是否支持加密
- 查看网络请求头是否包含
encrypt-key
Q3: 如何关闭加密?
- 设置
config.js中的enableEncrypt: false - 或者移除接口调用中的
encrypt: true参数
技术支持
如有问题,请参考:
- RuoYi-Vue 官方文档:http://doc.ruoyi.vip/
- RuoYi-Cloud 文档:http://doc.ruoyi.vip/ruoyi-cloud/