spring boot 接口加解密核心是利用 requestbodyadvice 和 responsebodyadvice 实现请求体解密与响应体加密,需满足 @requestbody、@responsebody、json 类型及流可重复读等前提;通过自定义注解控制开关,在 beforebodyread 和 beforebodywrite 中完成加解密逻辑,并注意流缓存、异常兜底与国密合规等关键细节。

Spring Boot 实现 REST 接口的请求与响应体加解密,核心是利用 Spring MVC 提供的 RequestBodyAdvice 和 ResponseBodyAdvice 两个扩展接口,在数据绑定前和序列化前做统一拦截处理。这种方式业务零侵入、逻辑集中、可按需开关,是生产环境推荐做法。
一、加解密需满足的前提条件
不是所有接口都能自动加解密,必须满足以下约束:
- 请求体必须带
@RequestBody注解(否则RequestBodyAdvice不生效) - 响应体必须由
@ResponseBody或@RestController方法返回(否则ResponseBodyAdvice不触发) - Content-Type 需为
application/json等支持 JSON 解析的类型(非 form-data 或 query 参数) - 请求体原始内容需可重复读取(需包装
HttpServletRequestWrapper缓存流)
二、请求体自动解密实现
通过 RequestBodyAdvice 在 Controller 入参前解密:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 自定义注解如
@Crypto(request = true)标记需要解密的接口方法 - 在
supports()中判断该方法是否标注且启用 request 解密 - 在
beforeBodyRead()中:读取原始输入流 → 去除引号或包装字段(如{"data":"xxx"})→ 调用解密器(AES/SM4/RSA)→ 将解密后字节重新封装为HttpInputMessage - 注意:若前端用 RSA 加密整个 JSON 字符串,后端需用私钥解密;若用 AES,则需先解密密钥再解业务数据(混合加密更安全)
三、响应体自动加密实现
通过 ResponseBodyAdvice 在返回前加密:
- 同样依赖
@Crypto(response = true)控制开关 - 在
supports()中校验方法是否启用响应加密 - 在
beforeBodyWrite()中:将已序列化的响应对象(如UserDTO)转为 JSON 字符串 → 加密 → 返回加密后的字符串(需配套修改produces类型,如application/vnd.encrypted+json) - 建议对加密结果 Base64 编码,避免传输乱码;同时可加入时间戳、随机 nonce 防重放
四、关键细节与避坑提示
实际落地时容易忽略但影响稳定性的点:
-
流只能读一次:必须用
ContentCachingRequestWrapper或自定义HttpServletRequestWrapper缓存原始 body,否则 Controller 再读就为空 - 加解密异常要兜底:解密失败时建议返回 400 并记录 traceId,避免暴露密钥或算法细节
- 算法选型建议:国内项目优先 SM4(国密合规),高并发场景用 AES-256-GCM(带完整性校验),RSA 仅用于交换对称密钥或签名
- 密钥管理:禁止硬编码;生产环境应对接 KMS 或配置中心动态拉取,支持密钥轮换










