基于SpringBoot与AES实现接口响应数据加密的代码示例
作者:小明爱吃火锅
前言
最近项目中为了保证数据安全,要求接口对关键响应数据,比如敏感信息(如用户信息、权限数据、业务关键内容等)必须加密传输,若以明文形式返回,极易被中间人窃取或篡改,造成用户隐私泄露与系统安全风险。
所以,本文将围绕一个实际的 Spring Boot 应用场景,基于 Hutool 工具包中的 AES 加密能力,封装一个 接口响应数据自动加密的解决方案,欢迎大家在评论区进行讨论。
一、背景与问题分析
在现有的项目中有两个接口:
- /getInfo 接口:模拟查询用户信息,构造了一个 JSON 字符串,然后使用 AES 加密,并将加密后的 Base64 密文 直接作为接口返回值。
- /decrypt 接口:提供一个解密入口,接收 Base64 密文,调用 AES 解密并返回明文,主要用于测试和验证。
因此,需要一种 统一、自动、可扩展的响应加密机制,让指定的接口或全局的响应数据,在返回给前端之前,自动完成 AES 加密处理,返回密文(Base64 格式),从而提升接口数据的安全性,同时降低重复劳动。
二、实现 Spring Boot 接口响应自动加密
封装一个统一机制,对 Spring Boot 接口的返回结果(如 Result 对象或 JSON 数据)在返回给客户端之前,自动进行 AES 加密,并返回密文的 Base64 字符串,保障敏感数据传输安全。
1. 加密工具:Hutool 的 SecureUtil.aes
Hutool 是一个 Java 工具库,其中的 SecureUtil.aes(key)
提供了 AES 加密 / 解密 的简便方法,支持:
- AES 加密为字节数组或 Base64 字符串
- 支持传入固定字节数组密钥
- 默认使用安全的填充与模式(如 PKCS5Padding / ECB 或 CBC,取决于构造方式)
2. 统一响应加密方案:使用 Spring AOP 或 ResponseBodyAdvice
接下来就是处理接口, 本次使用 ResponseBodyAdvice (Spring 提供的统一响应体拦截机制)
3. 定义一个注解
本次项目由于只对用户信息相关接口进行加密,可以定义一个自定义注解,对需要的接口进行处理,如:
import java.lang.annotation.*; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface EncryptResponse { }
接下来就可以,在需要加密的 Controller 方法或类上加上该注解:
@EncryptResponse @RequestMapping("/getInfo") public Result info(String uid) { // 模拟查询数据 String json = "{"uid":"" + uid + "","name":"testUser","pwd":"123456"}"; // 使用AES加密并返回Base64编码的结果 String encryptedData = SecureUtil.aes(aesKey).encryptBase64(json); return Result.ok(encryptedData); }
4. 实现 ResponseBodyAdvice 接口,统一处理加密逻辑
接下来就是,处理控制器统一加密响应操作,创建一个类:AESResponseEncryptAdvice.java
import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; import com.qiming.common.utils.Result; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; @RestControllerAdvice public class AESResponseEncryptAdvice implements ResponseBodyAdvice<Object> { // 与加密工具类中一致的 AES 密钥(Base64 解码) private static final byte[] AES_KEY = Base64.decode("ew7UkDs58QfulRGXD24R8A=="); @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { // 若想全局加密,直接返回 true return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { // 仅处理 Result 类型(或你自定义的统一返回类型),或 JSON 响应 if (body instanceof Result) { Result result = (Result) body; // 只有成功响应,且需要加密时才加密 data 字段(可根据需求调整) if (result.isSuccess()) { try { // 将整个返回的 data 部分(通常是 JSON 字符串或对象)进行加密 // 这里简单起见,直接将整个 Result 转为 JSON 字符串然后加密 String originalJson = JsonUtil.toJson(result); String encrypted = SecureUtil.aes(AES_KEY).encryptBase64(originalJson); // 返回一个特殊结构,或者直接返回加密后的密文 return Result.ok(encrypted); } catch (Exception e) { e.printStackTrace(); return Result.fail("响应加密失败"); } } } // 非加密接口,直接返回原数据 return body; } }
启动服务,调用获取用户信息接口,可以看到接口响应base64加密处理过的数据,而不是明文展示,至此就实现接口响应加密处理。
结语
通过对 Spring Boot 的 ResponseBodyAdvice 机制的合理利用,结合 Hutool 提供的 AES 加密能力,可以非常便捷地实现对 API 响应数据的 自动加密处理,有效提升数据传输的安全性,防止敏感信息泄露,同时对现有项目改动也不大。
以上就是基于SpringBoot与AES实现接口响应数据加密的代码示例的详细内容,更多关于SpringBoot AES接口响应数据加密的资料请关注脚本之家其它相关文章!