加密请求
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));
}响应解密
如果后端接口添加了 @ApiEncrypt,postEncrypt 会自动解密响应:
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 参数中传递敏感数据,即使使用加密请求
