加密传输
实现位于 src/core/encrypt。当系统配置 security.encrypt.enabled = true(见 SysConfig)时:
- JSON 写请求需带密文 body
- 成功响应的
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 一致)
请求约定
| 项 | 值 |
|---|---|
| Header | X-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。
缺少会话头或密钥过期会返回业务错误。