Skip to content

加密请求

Forge 提供 postEncrypt 工具用于发送加密请求,对应后端 @ApiDecrypt 注解。你在处理敏感数据(如密码、手机号)时需要使用加密请求。

使用场景

场景是否需要加密
密码修改
手机号传输
身份证号
银行卡号
普通列表查询
文件上传

使用方式

javascript
import { postEncrypt } from '@/utils/encrypt-request'

// 加密请求
const result = await postEncrypt('/system/user/updatePassword', {
  oldPassword: '123456',
  newPassword: '654321'
})

加密流程

前端 postEncrypt

1. 生成随机 AES 密钥
2. 用 AES 加密请求体
3. 用 RSA 公钥加密 AES 密钥
4. 发送 { encryptedData, encryptedKey }

后端 @ApiDecrypt

1. 用 RSA 私钥解密 AES 密钥
2. 用 AES 密钥解密请求体
3. 反序列化为 DTO

前后端密钥协商

前端配置

RSA 公钥在前端环境变量中配置:

# .env.local
VITE_RSA_PUBLIC_KEY=MIIBIjANBgkqhkiG...

后端配置

RSA 私钥在后端 application.yml 中配置:

yaml
forge:
  crypto:
    rsa:
      public-key: MIIBIjANBgkqhkiG...
      private-key: MIIEvQIBADANBgkqhkiG...

后端配合

后端接口添加 @ApiDecrypt 注解:

java
@PostMapping("/updatePassword")
@ApiDecrypt
public RespInfo updatePassword(@RequestBody UpdatePasswordDTO dto) {
    return RespInfo.success(userService.updatePassword(dto));
}

如果响应也需要加密,添加 @ApiEncrypt

java
@PostMapping("/save")
@ApiDecrypt
@ApiEncrypt
public RespInfo save(@RequestBody UserDTO dto) {
    return RespInfo.success(userService.save(dto));
}

响应解密

如果后端接口添加了 @ApiEncryptpostEncrypt 会自动解密响应:

javascript
// 前端自动解密,直接拿到明文数据
const result = await postEncrypt('/system/user/save', { name: '张三' })
console.log(result) // { id: 1, name: '张三' }

与普通请求对比

javascript
import { request } from '@/utils/http'
import { postEncrypt } from '@/utils/encrypt-request'

// 普通请求(明文)
request.post('/system/user', { username: 'admin' })

// 加密请求(密文传输)
postEncrypt('/system/user/save', { username: 'admin', phone: '13800138000' })

注意事项

  • 仅 POST 请求支持加密,GET 请求不加密
  • 密钥不要硬编码在代码中,使用环境变量
  • 加密请求的响应也是加密的postEncrypt 会自动解密
  • 不要在 URL 参数中传递敏感数据,即使使用加密请求

Forge Admin — 基于 Vue3 + Spring Boot 的企业级后台管理框架