基于SpringBoot与AES实现接口响应数据加密的代码示例

 更新时间:2025年08月26日 10:37:23   作者:小明爱吃火锅  
最近项目中为了保证数据安全,要求接口对关键响应数据,比如敏感信息(如用户信息、权限数据、业务关键内容等)必须加密传输,所以,本文将围绕一个实际的SpringBoot应用场景,基于​​Hutool工具包中的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接口响应数据加密的资料请关注脚本之家其它相关文章!

相关文章

  • java并发学习之BlockingQueue实现生产者消费者详解

    java并发学习之BlockingQueue实现生产者消费者详解

    这篇文章主要介绍了java并发学习之BlockingQueue实现生产者消费者详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java核心编程之文件随机读写类RandomAccessFile详解

    Java核心编程之文件随机读写类RandomAccessFile详解

    这篇文章主要为大家详细介绍了Java核心编程之文件随机读写类RandomAccessFile,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 使用eclipse快速新建spirngboot项目的方法

    使用eclipse快速新建spirngboot项目的方法

    本篇文章主要介绍了使用eclipse快速新建spirngboot项目的方法,具有一定的参考价值,有兴趣的可以了解一下
    2017-04-04
  • SpringBoot实现RabbitMQ监听消息的四种方式

    SpringBoot实现RabbitMQ监听消息的四种方式

    本文主要介绍了SpringBoot实现RabbitMQ监听消息的四种方式,包括@RabbitListener,MessageListener接口,MessageListenerAdapter适配器,@RabbitHandler这几种,感兴趣的可以了解一下
    2024-05-05
  • Java fastjson解析json字符串实现过程解析

    Java fastjson解析json字符串实现过程解析

    这篇文章主要介绍了Java fastjson解析json字符串实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 关于SpringBoot的spring.factories文件详细说明

    关于SpringBoot的spring.factories文件详细说明

    spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一,它位于每个 Spring Boot 自动配置模块的 META-INF 目录下,经常看到 spring.factories 文件,却没有对它进行深入的了解和分析,今天我们就一起揭开面纱看看它的内在,需要的朋友可以参考下
    2024-12-12
  • JAVA程序员不得不留意的编码规范

    JAVA程序员不得不留意的编码规范

    这篇文章主要介绍了JAVA程序员不得不留意的编码规范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Spring Profiles使用方法详解

    Spring Profiles使用方法详解

    在你刚接触SpringBoot的时候有没有对它提供的Profile有些许不适应,经过摸索后才领悟到它的强大。今天我就对Profile进行一点归纳总结,留作互联网记忆
    2022-12-12
  • JAVA实现汉字转拼音功能代码实例

    JAVA实现汉字转拼音功能代码实例

    这篇文章主要介绍了JAVA实现汉字转拼音功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java笛卡尔积算法原理与实现方法详解

    Java笛卡尔积算法原理与实现方法详解

    这篇文章主要介绍了Java笛卡尔积算法原理与实现方法,结合实例形式较为详细的分析了笛卡尔积算法的原理及java定义与使用笛卡尔积算法的相关操作技巧,需要的朋友可以参考下
    2017-12-12

最新评论