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