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

接口加密使用指南

简介

本项目已集成接口加密功能,支持 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,开发环境设为 false
  • rsaPublicKey: 需要替换为实际的 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
  })
}

方式二:全局启用加密

  1. 修改 config.js
export default {
  enableEncrypt: true,  // 全局开启
  // ...其他配置
}
  1. 接口调用:
// 需要加密的接口
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 私钥放在前端
    • 确保公钥与后端一致
    • 定期更新密钥对

示例代码

登录接口加密

// 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 请求不加密
  })
}

调试建议

  1. 开发环境:设置 enableEncrypt: false,方便调试
  2. 生产环境:设置 enableEncrypt: true,确保数据安全
  3. 日志输出:加密失败时会在控制台输出错误信息
  4. 网络抓包:可以通过抓包工具查看加密后的数据

常见问题

Q1: 提示"数据解密失败"

  • 检查 RSA 公私钥是否与后端一致
  • 确认后端是否返回了加密响应
  • 查看控制台错误日志

Q2: 接口请求失败?

  • 检查 enableEncrypt 配置是否正确
  • 确认接口是否支持加密
  • 查看网络请求头是否包含 encrypt-key

Q3: 如何关闭加密?

  • 设置 config.js 中的 enableEncrypt: false
  • 或者移除接口调用中的 encrypt: true 参数

技术支持

如有问题,请参考: