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外卖订购系统
- 【数据结构学习】从零起步:学习数据结构的完整路径
相关文章:
Spring Boot实现数据加密脱敏:注解 + 反射 + AOP
文章目录 1. 引言2. 数据加密和脱敏的需求3. Spring Boot项目初始化4. 敏感数据加密注解设计5. 实现加密和脱敏的工具类6. 实体类和加密脱敏注解的使用7. 利用AOP实现加密和脱敏8. 完善AOP切面9. 测试10. 拓展功能与未来展望10.1 加密算法的选择10.2 动态注解配置 11. 总结 &am…...
jmeter和meterSphere如何使用第三方jar包
工具引用jar包语言都是beanshell 问题起因:metersphere 接口自动化实现过程中,如何实现字符串加密且加密方法依赖第三方库; 使用语言:beanshell脚本语言,java语言 使用工具:idea jmeter metersphere 1.首…...
API对象上千个,有啥关联性,kubectl-tree一键搞定
关注【云原生百宝箱】公众号,获取更多云原生消息 "kubectl-tree 是一款强大的 kubectl 插件,通过 ownerReferences 实现 Kubernetes 对象之间的所有权关系探索。相较于 kubectl lineage,它不仅更全面理解 API 对象的逻辑关系,…...
java自定义工具类在List快速查找相同字段值对象
根据对象某一字段名,获取字段值,将List转换为Map中包含list,Key为字段值,Value为相同字段值的对象list,快速定位具有相同字段值的对象,转换之后便于在Map中根据字段值快速查找相同字段值的对象 //List转Map…...
codeforces Hello 2024 - C - Grouping Increases --- 题解
目录 Grouping Increases 题目描述: 思路解析: 代码实现: Grouping Increases 题目描述: 给你一个大小为n的数组a,你可以把数组a划分为两个子序列s和t,a中元素,要么在子序列s中,…...
STM32H5培训(一)总览
文章目录 1. 前言2. STM32H5系列MCU的特点和新功能包括性能提升、新外设和安全功能等3. STM32H5系列型号之间的区别和关键资源对比4. 性能和功能亮点6. 开发生态参考: 1. 前言 本篇主要介绍STM32H5系列MCU的特点和新功能,包括全新的M33内核、250M主频处…...
亚马逊云科技 WAF 部署小指南(五):在客户端集成 Amazon WAF SDK 抵御 DDoS 攻击...
方案介绍 在 WAF 部署小指南(一)中,我们了解了 Amazon WAF 的原理,并通过创建 WEB ACL 和托管规则防护常见的攻击。也了解了通过创建自定义规则在 HTTP 请求到达应用之前判断是阻断还是允许该请求。在 Amazon WAF 自定义规则中&am…...
高光谱分类论文解读分享之基于多模态融合Transformer的遥感图像分类方法
IEEE TGRS 2023:基于多模态融合Transformer的遥感图像分类方法 题目 Multimodal Fusion Transformer for Remote Sensing Image Classification 作者 Swalpa Kumar Roy , Student Member, IEEE, Ankur Deria , Danfeng Hong , Senior Member, IEEE, Behnood Ras…...
Trans论文复现:基于数据驱动的新能源充电站两阶段规划方法程序代码!
适用平台:MatlabYalmipCplex/Gurobi; 文章提出了一种电动汽车充电站的两阶段规划方法,第一阶段通过蒙特卡洛法模拟充电车辆需求和电池充放电数据来确定充电站位置;第二阶段通过数据驱动的分布鲁棒优化方法优化充电站的新能源和电池…...
将抖音视频转成MP3并下载
这篇是在上一篇的基础上写的,这篇负责抖音作者详情页的视频转声音提取,这篇需要用到后端。 本地启动后端后,在控制台输入对应代码,即可实现hover在封面上,按d一键下载音频 控制台代码 // 获取作者的视频列表var liEle…...
C程序训练:与输入有关的错误
在录入程序时有时稍不注意就可能录入错误的字符导致程序运行结果出现错误,下面举例说明。 下面程序的运行结果是错的,但程序又没有错,到底问题出现在哪呢? #include <stdio.h> int main() {FILE *fp;int i, k, n;fpfopen(…...
制作 CentOS Stream9 的U盘系统启动盘
一、简述 注:请勿用于商用,如有版权纠纷,于博主无任何关系。(仅用于学习研究使用) 由于CentOs Linux 7和CentOs Stream8终止日期是2024年,需要将系统升级到最新版本的CentOs Stream9,下面是刻录系统盘的操…...
Vulnhub靶机:driftingblues 1
一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:driftingblues1(10.0.2.17) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entr…...
CloudCompare——点云空间圆拟合
目录 1.概述2.软件实现3.完整操作4.算法源码5.相关代码 本文由CSDN点云侠原创,CloudCompare——点云空间圆拟合,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 1.概述 CloudCompare软件中的To…...
解决POI报错POIXMLTypeLoader不存在的问题
问题: springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoaderat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet…...
关于rewriteBatchedStatements的源码分析
在之前的优惠券兑换码需求中,涉及批量写入问题,其中有一个关键的连接配置参数非常重要——rewriteBatchedStatements,当该值配置为true时,Statement将可能对批量插入sql进行重写。 何谓重写?原来提交的批量执行语句&a…...
自动化神器 Playwright 的 Web 自动化测试解决方案
1. 主流框架的认识 总结: 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化,因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三…...
docker filebeat 将日志多级目录和多维json数据日志同步到es
注 使用的时候先调试调试配置,调试成功在尝试写入es,如果es写入失败就是es账户.密码/白名单.和index未创建的问题,细节可以留言 setup.template.priority 模板优先级 调整这个可以配置一台机器多个filebeat 容器启动 多级目录日志和多维josn日志结构 filebeat.inputs:- typ…...
【机器学习】模型参数优化工具:Optuna使用分步指南(附XGB/LGBM调优代码)
常用的调参方式和工具包 常用的调参方式包括网格搜索(Grid Search)、**随机搜索(Random Search)和贝叶斯优化(Bayesian Optimization)**等。 工具包方面,Scikit-learn提供了GridSearchCV和RandomizedSearchCV等用于网格搜索和随机搜索的工具。另外,有一…...
webview全屏处理,即插即用
去年双十一有个直播的需求,听起来很简单,技术也都很成熟,但是真的开始实现后,还是有不少坑的,首先第一个uc内核不支持webRTC协议,需要重新开发chrome内核的webview,其次webview全屏处理、悬浮窗…...
ChatGPT背后的秘密武器:一文读懂RLHF如何让大模型更懂人类
ChatGPT背后的秘密武器:一文读懂RLHF如何让大模型更懂人类 当你向ChatGPT提问时,是否曾惊叹于它回答的流畅性和准确性?这背后隐藏着一项关键技术——基于人类反馈的强化学习(RLHF)。这项技术正在重塑我们与AI交互的方式…...
webMAN-MOD实战指南:构建PS3主机扩展服务系统
webMAN-MOD实战指南:构建PS3主机扩展服务系统 【免费下载链接】webMAN-MOD Extended services for PS3 console (web server, ftp server, netiso, ntfs, ps3mapi, etc.) 项目地址: https://gitcode.com/gh_mirrors/we/webMAN-MOD 当你在PS3主机上尝试加载网…...
MedGemma 1.5开源医疗模型:本地化部署满足等保2.0三级与GDPR双合规要求
MedGemma 1.5开源医疗模型:本地化部署满足等保2.0三级与GDPR双合规要求 1. 项目概述与核心价值 MedGemma 1.5是基于Google Gemma架构开发的医疗专用AI模型,专门针对医学问答、病理分析和术语解释场景优化。这个4B参数规模的模型经过PubMed、MedQA等专业…...
零基础部署Fun-ASR语音识别:支持GPU/CPU/MPS,开箱即用无需配置
零基础部署Fun-ASR语音识别:支持GPU/CPU/MPS,开箱即用无需配置 1. 为什么选择Fun-ASR? 语音识别技术已经成为现代办公和内容创作的重要工具,但传统解决方案往往面临三大痛点:部署复杂、准确率不足、依赖云端服务。Fu…...
vLLM-v0.17.1效果展示:vLLM支持MoE模型(如Mixtral)推理实测
vLLM-v0.17.1效果展示:vLLM支持MoE模型(如Mixtral)推理实测 1. vLLM框架核心能力 vLLM是一个专注于大语言模型推理的高性能服务库,最新发布的v0.17.1版本带来了对MoE(混合专家)架构模型的全面支持。这个最…...
本地图片检索新方案:ImageSearch完全使用指南
本地图片检索新方案:ImageSearch完全使用指南 【免费下载链接】ImageSearch 基于.NET8的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 当你的电脑中存储了成千上万张图片&…...
IP5306电源芯片的‘怪脾气’:实测开机半分钟就休眠?手把手教你两个硬件调试技巧
IP5306电源芯片实战调试:破解自动休眠难题的硬件级方案 实验室里,示波器屏幕上那条本该稳定的电压线突然跌落至零,系统再次陷入休眠——这已经是今天第七次重现IP5306芯片的"怪脾气"。作为一款广泛应用于移动电源的高集成度SOC&…...
Ryujinx:高性能Nintendo Switch模拟器技术指南
Ryujinx:高性能Nintendo Switch模拟器技术指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款采用C#开发的开源Nintendo Switch模拟器,它通过精确…...
STM32智能甲鱼养殖系统设计与实现
基于STM32的智能甲鱼养殖系统设计与实现1. 项目概述1.1 系统背景现代水产养殖行业正面临从传统人工管理向智能化转型的关键时期。甲鱼作为对水质环境敏感的特种水产品,其养殖过程中需要持续监测多项水质参数并保持稳定环境。传统人工监测方式存在响应滞后、精度不足…...
Arduino激光360°扫描库:VL53L0X+28BYJ-48低成本建图方案
1. 项目概述LaserToMap360 是一个面向嵌入式空间感知应用的轻量级 Arduino 库,专为构建低成本、可复现的 360 激光测距扫描系统而设计。其核心目标并非替代专业 SLAM 系统,而是提供一种工程上可快速验证、硬件上可即插即用、数据上可直接对接上位机可视化…...
