Spring Boot实现数据加密脱敏:注解 + 反射 + AOP

文章目录

    • 1. 引言
    • 2. 数据加密和脱敏的需求
    • 3. Spring Boot项目初始化
    • 4. 敏感数据加密注解设计
    • 5. 实现加密和脱敏的工具类
    • 6. 实体类和加密脱敏注解的使用
    • 7. 利用AOP实现加密和脱敏
    • 8. 完善AOP切面
    • 9. 测试
    • 10. 拓展功能与未来展望
      • 10.1 加密算法的选择
      • 10.2 动态注解配置
    • 11. 总结

在这里插入图片描述

🎉Spring Boot实现数据加密脱敏:注解 + 反射 + AOP


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:架构设计
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

1. 引言

随着信息安全的日益重要,对敏感数据进行加密和脱敏已成为业务开发中不可忽视的一环。本文将介绍如何在Spring Boot项目中利用注解、反射和AOP的组合,实现对敏感数据的加密和脱敏,提高数据安全性。

2. 数据加密和脱敏的需求

在实际应用中,我们常常需要对一些敏感数据进行保护,以防止敏感信息泄露。数据加密用于将原始数据进行加密,使得即便数据被非法获取,也难以解密;而数据脱敏则是在数据显示时对敏感信息进行掩盖,确保展示给用户的数据不包含真实的敏感信息。

3. Spring Boot项目初始化

首先,我们需要创建一个基本的Spring Boot项目。可以使用Spring Initializer(https://start.spring.io/)进行快速初始化,选择相应的依赖项。

在这里插入图片描述

4. 敏感数据加密注解设计

为了方便对敏感数据进行加密,我们设计一个自定义注解 @SensitiveData

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SensitiveData {
}

5. 实现加密和脱敏的工具类

创建一个工具类 SensitiveDataUtils,用于实现对敏感数据的加密和脱敏操作。

import org.springframework.stereotype.Component;@Component
public class SensitiveDataUtils {// 模拟加密操作public String encrypt(String data) {// 实际项目中使用加密算法进行操作return "Encrypted-" + data;}// 模拟脱敏操作public String mask(String data) {// 实际项目中使用脱敏算法进行操作return "****" + data.substring(data.length() - 4);}
}

6. 实体类和加密脱敏注解的使用

创建一个包含敏感数据的实体类,并在需要加密或脱敏的字段上添加 @SensitiveData 注解。

public class User {private Long id;@SensitiveDataprivate String username;@SensitiveDataprivate String password;// 省略其他字段的 getter 和 setter 方法
}

7. 利用AOP实现加密和脱敏

通过AOP(面向切面编程),我们可以在方法执行前后对敏感数据进行加密和脱敏。

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Aspect
@Component
public class SensitiveDataAspect {@Autowiredprivate SensitiveDataUtils sensitiveDataUtils;@Pointcut("@annotation(SensitiveData)")public void sensitiveDataPointcut() {}@Before("sensitiveDataPointcut()")public void beforeMethodExecution() {// 获取当前方法中标记了@SensitiveData注解的字段,进行加密或脱敏// 利用反射获取字段值,调用SensitiveDataUtils中的加密或脱敏方法}
}

在上述AOP切面中,通过 @Pointcut 注解定义了一个切入点,指定了被 @SensitiveData 注解标记的方法。在 @Before 注解的方法中,我们可以获取到标记了 @SensitiveData 注解的字段,并调用 SensitiveDataUtils 中的相应方法进行加密或脱敏。

8. 完善AOP切面

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.FieldSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;@Aspect
@Component
public class SensitiveDataAspect {@Autowiredprivate SensitiveDataUtils sensitiveDataUtils;@Pointcut("@annotation(SensitiveData)")public void sensitiveDataPointcut() {}@Before("sensitiveDataPointcut()")public void beforeMethodExecution(JoinPoint joinPoint) {Object target = joinPoint.getTarget();Field field = ((FieldSignature) joinPoint.getSignature()).getField();field.setAccessible(true);try {Object fieldValue = field.get(target);if (fieldValue instanceof String) {String encryptedValue = sensitiveDataUtils.encrypt((String) fieldValue);field.set(target, encryptedValue);}} catch (IllegalAccessException e) {e.printStackTrace();}}
}

在完善后的AOP切面中,我们通过反射获取了标记了 @SensitiveData 注解的字段,并对其进行加密操作。这样,在调用标记了 @SensitiveData 注解的方法前,会先对敏感数据进行加密。

9. 测试

创建一个简单的Controller进行测试。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@SensitiveDataprivate String password = "userPassword123";@GetMapping("/user")public User getUser() {User user = new User();user.setId(1L);user.setUsername("john_doe");user.setPassword(password);return user;}
}

在上述示例中,password 字段被标记了 @SensitiveData 注解,因此在返回 User 对象时,password 字段会被加密。

10. 拓展功能与未来展望

10.1 加密算法的选择

在实际项目中,可以根据安全需求选择更为复杂和安全的加密算法,例如AES、RSA等。这可以通过在 SensitiveDataUtils 中调用相应的加密算法来实现。

10.2 动态注解配置

为了提高灵活性,可以考虑通过配置文件或数据库动态配置哪些字段需要加密或脱敏。这样可以根据具体业务需求动态调整敏感数据的处理策略。

11. 总结

通过结合注解、反射和AOP,我们成功实现了Spring Boot项目中对敏感数据的加密和脱敏。这一方案不仅提高了数据的安全性,也保障了业务开发的灵活性。在实际项目中,应该根据具体需求选择合适的加密算法,并考虑动态配置的方式,以便更好地适应业务变化。希望本文对你在Spring Boot项目中实现数据加密和脱敏提供了一些有用的思路。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/326671.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三剑客前端教程

前端教程 结构层(html)表现层(css)行为层(javascript) HTML 超文本标记语言) HTML(超文本标记语言——HyperText Markup Language)是构成 Web 世界的一砖一瓦。它定义…

云服务器ECS搭建个人项目

一、登录云服务器ECS 在ECS实例的操作列中点击远程连接云服务器ECS,点击实例最右侧的远程连接按钮,并立即登录后会跳转至Workbench的登录页面。但是第一次进去不知道密码?可以重置密码 登录后可以看到如下页面,说明已经成功登录到…

【数据结构】树的遍历

树的遍历 前序遍历 前序遍历是按照根节点->左子树->右子树的顺序进行遍历 图片来源维基百科深度优先遍历(前序遍历): F, B, A, D, C, E, G, I, H. 代码实现 递归 # class TreeNode: # def __init__(self, x): # self.val x # …

RFID标签在汽车监管方面的应用与实施方案

RFID技术在汽车工业领域得到了广泛应用,主要体现在汽车资质证书远程监管系统的普及化,系统包括OBD接口监视器、车证监管箱、超高频读写设备、应用系统软件以及大数据采集与处理等组成部分。 在汽车物流监管方面,系统利用OBD接口监控车辆并实时…

idea中使用Lombok 失效,@Slf4j 找不到符号的解决办法

文章目录 一、前言二、问题排查和解决方案三、 其他解决方案3.1 另一种解决方案3.2 参考文章 一、前言 今天在一个多module工程中,新增了一个 springboot(版本 2.2.4.RELEASE) module,像往常一样,我引入了lombok依赖&…

Nacos 持久化及集群的搭建【微服务】

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务,管理起来非常简单,但…

数据采集有哪些方法?HTTP代理起到什么作用?

在这个数字化的时代,数据就如同生活中不可或缺的元素,我们的行为、喜好、甚至是想法都被转化成了数字化的信息。那么,现代社会是如何进行数据的采集的呢?让我们一同来看看! 1. 网络浏览行为的追踪 在我们浏览互联网的…

如何从 Android手机存储卡中恢复已删除的文件

作为 Android 用户,您可能会使用 存储卡来扩展手机的存储容量,并存储照片、视频和其他类型的文件。但意外发生时,您可能会错误地删除其中一些文件,或者由于其他原因而丢失它们。在大多数情况下,您可以通过主动并遵循正…

【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之Spring定义Jackson转换Null的方法和实现案例

Spring自动定义Jackson转换Null得方法 背景MessageConverter 使用Jackson原生方式处理空字段(次重点方案)ObjectMapper的配置选项通过使用注解的方式 MappingJackson2HttpMessageConverter(重点方案)创建MappingJackson2HttpMessa…

vue3+echart绘制中国地图并根据后端返回的坐标实现涟漪动画效果

1.效果图 2.前期准备 main.js app.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M6tDCApL,// v:3.0, // 默认使用3.0// type: WebGL // ||API 默认API (使用此模式 BMapBMapGL) });i…

vue3 实现el-date-picker日期筛选过程

一、图例 二、需求&#xff1a; 有2个查询条件&#xff0c;startTime 和 endTime 选中时间1&#xff0c;禁止选中时间2&#xff0c;当前值传递给 startTime 选中时间2&#xff0c;禁止选中时间1&#xff0c;当前值传递给 startTime 和 endTime 三、完整代码 <div class…

无心剑七绝《译无止境》

七绝译无止境 人生跌宕几春秋 苦辣酸甜永不休 只待通灵成妙译 神思曼舞醉琼楼 2024年1月6日 平水韵十一尤平韵 无心剑的这首《译无止境》以七言绝句的形式&#xff0c;表达了对翻译事业的热爱和追求。 首句“人生跌宕几春秋”&#xff0c;意味着人生的曲折变化&#xff0c…