基于 Spring Boot 与 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.定义一个注解

本次项目由于只对用户信息相关接口进行加密,可以定义一个自定义注解,对需要的接口进行处理,如:

java 复制代码
import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EncryptResponse {
}

接下来就可以,在需要加密的 Controller 方法或类上加上该注解:

python 复制代码
@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

typescript 复制代码
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 响应数据的 ​​自动加密处理​​,有效提升数据传输的安全性,防止敏感信息泄露,同时对现有项目改动也不大。


相关推荐
程序员爱钓鱼13 小时前
Go语言实战案例 — 项目实战篇:图书管理系统(文件存储)
后端·google·go
元闰子13 小时前
OLTP上云,哪种架构最划算?·VLDB'25
数据库·后端·云原生
IT_陈寒14 小时前
Vite 5.0重磅升级:8个性能优化秘诀让你的构建速度飙升200%!🚀
前端·人工智能·后端
hui函数14 小时前
scrapy框架-day02
后端·爬虫·python·scrapy
Moshow郑锴14 小时前
SpringBootCodeGenerator使用JSqlParser解析DDL CREATE SQL 语句
spring boot·后端·sql
小沈同学呀20 小时前
创建一个Spring Boot Starter风格的Basic认证SDK
java·spring boot·后端
方圆想当图灵1 天前
如何让百万 QPS 下的服务更高效?
分布式·后端
凤山老林1 天前
SpringBoot 轻量级一站式日志可视化与JVM监控
jvm·spring boot·后端
凡梦千华1 天前
Django时区感知
后端·python·django
Chan161 天前
JVM从入门到实战:从字节码组成、类生命周期到双亲委派及打破双亲委派机制
java·jvm·spring boot·后端·intellij-idea