Skip to content

加密传输

实现位于 src/core/encrypt。当系统配置 security.encrypt.enabled = true(见 SysConfig)时:

  1. JSON 写请求需带密文 body
  2. 成功响应的 data 字段会被加密为 Base64 字符串

注册

入口已挂载:

ts
Application.registry(cors())
  .registry(json())
  .registry(encryptMiddleware())
  .registry(Auth({ ignore: [/* ... */, '/api/aes/key'] }))
  .registry(Log())
  .start()

json() 必须在加密中间件之前,以便解析出 encryptData 后再替换 req.body

获取会话密钥

http
GET /api/aes/key

无需登录。响应示例:

json
{
  "code": 200,
  "data": {
    "sessionId": "uuid",
    "aesKey": "Base64(utf8 的 16 字节明文密钥)"
  }
}
  • 服务端内存保存 16 字符明文密钥,TTL 300 秒
  • 前端拿到的 aesKey 是 Base64;加解密时用解析后的 16 字节密钥
  • 算法:AES-128-ECB + PKCS7(与前端 CryptoJS 一致)

请求约定

HeaderX-Encrypt-Session: {sessionId}
Body{ "encryptData": "<Base64 密文>" }
明文原始业务 JSON 字符串再加密

跳过加密的场景:

  • 白名单:/api/aes/key/api/sys_config/public
  • multipart/form-data(文件上传)
  • GET / DELETE / HEAD(无 JSON body 时不解密请求;响应仍可能加密)

响应约定

开启加密且非白名单时:若 ResponseData.data != null,则 data 变为密文字符串;前端需用同一会话密钥解密后再 JSON.parse

缺少会话头或密钥过期会返回业务错误。

相关章节

基于 VitePress 构建