【SpringBoot高级篇】SpringBoot集成jasypt 配置脱敏和数据脱敏
【SpringBoot高级篇】SpringBoot集成jasypt数据脱敏
- 配置脱敏
- 使用场景
- 配置脱敏实践
- 数据脱敏
- pom
- yml
- EncryptMethod
- EncryptField
- EncryptConstant
- EncryptHandler
- Person
- JasyptApplication
配置脱敏
使用场景
数据库密码直接明文写在application.yml配置中,对安全来说,是一个很大的挑战。一旦密码泄漏,将会带来很大的安全隐患。尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密。
开源框架Jasypt可以解决上面的问题。
-
Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中使用特定格式直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。
-
jasypt 同一个密钥(secretKey)对同一个内容执行加密,每次生成的密文都是不一样的,但是根据根据这些密文解密成原内容都是可以的。
配置脱敏实践
<!--配置文件加密--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.0</version></dependency>
配置文件加入秘钥配置项jasypt.encryptor.password
,并将需要脱敏的value
值替换成预先经过加密的内容ENC(zxcvb/asdfg)
。
这个格式我们是可以随意定义的,比如想要abc[zxcvb/asdfg]
格式,只要配置前缀和后缀即可。
jasypt:encryptor:property:prefix: "abc["suffix: "]"
ENC(XXX)
格式主要为了便于识别该值是否需要解密,如不按照该格式配置,在加载配置项的时候jasypt
将保持原值,不进行解密。
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/order_db_1?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTCusername: rootpassword: ENC(ipHBo9hH/W756iU3HjAZJA==)
# 秘钥
jasypt:encryptor:password: csdn
预先生成的加密值,可以通过代码内调用API生成
@Autowired
private StringEncryptor stringEncryptor;@GetMapping("/encode")
public String encrypt(String content) {String encryptStr = stringEncryptor.encrypt(content);System.out.println("加密后的内容:" + encryptStr);return "加密后的内容:" + encryptStr;
}
数据脱敏
生产环境用户的隐私数据,比如手机号、身份证或者一些账号配置等信息,入库时都要进行不落地脱敏,也就是在进入我们系统时就要实时的脱敏处理。
用户数据进入系统,脱敏处理后持久化到数据库,用户查询数据时还要进行反向解密。这种场景一般需要全局处理,那么用AOP
切面来实现在适合不过了。
首先自定义两个注解@EncryptField
、@EncryptMethod
分别用在字段属性和方法上,实现思路很简单,只要方法上应用到@EncryptMethod
注解,则检查入参字段是否标注@EncryptField
注解,有则将对应字段内容加密。
pom
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>
yml
# 秘钥
jasypt:encryptor:password: csdn
EncryptMethod
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptMethod {String type() default EncryptConstant.ENCRYPT;
}
EncryptField
@Documented
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptField {String[] value() default "";
}
EncryptConstant
public interface EncryptConstant {// 加密String ENCRYPT = "encrypt";// 解密String DECRYPT = "decrypt";
}
EncryptHandler
@Slf4j
@Aspect
@Component
public class EncryptHandler {@Autowiredprivate StringEncryptor stringEncryptor;@Pointcut("@annotation(cn.zysheep.annotation.EncryptMethod)")public void pointCut() {}@Around("pointCut()")public Object around(ProceedingJoinPoint joinPoint) {/*** 加密*/Object[] encrypt = encrypt(joinPoint);/*** 解密*/Object decrypt = decrypt(joinPoint,encrypt);return decrypt;}public Object[] encrypt(ProceedingJoinPoint joinPoint) {Object[] args = joinPoint.getArgs();try {if (args.length != 0) {for (int i = 0; i < args.length; i++) {Object o = args[i];if (o instanceof String) {args[i] = encryptValue(o);} else {args[i] = handler(o, EncryptConstant.ENCRYPT);}//TODO 其余类型自己看实际情况加}}} catch (IllegalAccessException e) {e.printStackTrace();}return args;}public Object decrypt(ProceedingJoinPoint joinPoint,Object[] args) {Object result = null;try {Object obj = joinPoint.proceed(args);if (obj != null) {if (obj instanceof String) {result = decryptValue(obj);} else {result = handler(obj, EncryptConstant.DECRYPT);}//TODO 其余类型自己看实际情况加}} catch (Throwable e) {e.printStackTrace();}return result;}private Object handler(Object obj, String type) throws IllegalAccessException {if (Objects.isNull(obj)) {return null;}Field[] fields = obj.getClass().getDeclaredFields();for (Field field : fields) {boolean annotationPresent = field.isAnnotationPresent(EncryptField.class);if (annotationPresent) {field.setAccessible(true);String value;String realValue = (String) field.get(obj);if (EncryptConstant.DECRYPT.equals(type)) {value = stringEncryptor.decrypt(realValue);} else {value = stringEncryptor.encrypt(realValue);}field.set(obj, value);}}return obj;}public String encryptValue(Object realValue) {String value = null;try {value = stringEncryptor.encrypt(String.valueOf(realValue));} catch (Exception ex) {return value;}return value;}public String decryptValue(Object realValue) {String value = String.valueOf(realValue);try {value = stringEncryptor.decrypt(value);} catch (Exception ex) {return value;}return value;}
}
Person
@Data
public class Person {private Integer id;@EncryptFieldprivate String mobile;@EncryptFieldprivate String address;private Integer age;private BigDecimal wages;
}
JasyptApplication
@RestController
@SpringBootApplication
public class JasyptApplication {@Autowiredprivate StringEncryptor stringEncryptor;public static void main(String[] args) {SpringApplication.run(JasyptApplication.class, args);}@GetMapping("/encode")public String encrypt(String content) {String encryptStr = stringEncryptor.encrypt(content);System.out.println("加密后的内容:" + encryptStr);return "加密后的内容:" + encryptStr;}@EncryptMethod@PostMapping("/dataEnc")public Person encrypt(@RequestBody Person person, @EncryptField String username) throws JsonProcessingException {ObjectMapper json = new ObjectMapper();String writeValueAsString = json.writeValueAsString(person);System.out.println(writeValueAsString);System.out.println(username);return person;}@EncryptMethod@GetMapping("/getParam")public String getParam( @EncryptField String username) {System.out.println("保存数据库业务操作===>username: "+username);return username;}
}
相关文章:
【SpringBoot高级篇】SpringBoot集成jasypt 配置脱敏和数据脱敏
【SpringBoot高级篇】SpringBoot集成jasypt数据脱敏配置脱敏使用场景配置脱敏实践数据脱敏pomymlEncryptMethodEncryptFieldEncryptConstantEncryptHandlerPersonJasyptApplication配置脱敏 使用场景 数据库密码直接明文写在application.yml配置中,对安全来说&…...
JAVA知识体系(二)
分布式: 微服务之间的通信 当前我们微服务架构中,微服务之间使用的三种通讯方式:代理访问,feign请求,消息队列 其中代理访问我们使用的是netflix-zuul,只要是对外暴露请求的所有网关,主要用在…...
Verilog 学习第八节(数码管段码显示)
共阴极数码管:低电平端接的都是0,高电平端哪里设置为1 ,哪里就亮~ 共阳极数码管与之相反~ 视觉暂留: 对于三位的共阴极数码管 第0.01s:让数码管0的a段亮,其他数码管全灭 Sel0为高电平,sel1和sel…...
方案开发|快递吊钩电子秤方案
物流的发展为我们提供了生活的便利,足不出户仍可以感受天南地北的美食的特产,在现在这个时代已经是现实并发展成为常态的事情了。在物流发展的每一个环节中,吊钩电子秤也是它必不可缺的一环。人们在寄出物品前需要通过吊钩电子秤称量过重量&a…...
Spring-IOC容器初始化过程
Spring IOC容器的初始化过程:Resource定位,BeanDefinition载入,向IOC容器注册BeanDefinition。整个过程由refresh()方法触发,三个过程由不同的模块完成,使用户更加灵活的对这三个过程剪裁和扩展。 BeanDefinition 就是POJO对象在IOC容器中的抽象。通过BeanDefinition 这个…...
AspCms标签手册
网站通用标签{aspcms:sitepath} 网站终极目录(可放在二级目录,其它语言则在三级目录){aspcms:languagepath} 语言目录{aspcms:siteurl} 网站地址{aspcms:sitelogo} LOGO地址{aspcms:sitetitle} 网站标题{aspcms:additiontitle} 网站附加标题{aspcms:sitekeywords} 网站关键词{a…...
什么是Netty
一.Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算…...
SpringCloud:统一网关Gateway
目录 1、网关介绍 2、搭建网关服务 3、路由断言工厂 4、路由过滤器 5、全局过滤器GlobalFilter 6、过滤器执行顺序 7、跨域问题处理 1、网关介绍 网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互 连设备࿰…...
【独家】华为OD机试 - 最差产品奖(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...
力扣解法汇总1599. 经营摩天轮的最大利润
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 你正在经营一座摩天轮,该摩天轮共有 4 个座舱 ,每个座舱…...
MySQL-常见的五种索引
什么是索引? 百度百科:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于…...
Linux学习第二十三节-压缩和解压缩和tar打包工具
1.压缩与解压缩(不常用)①Linux独有压缩格式及命令工具: gzip---> .gz bzip2---> .bz2 xz---> .xz②压缩命令格式: 压缩命令:gzip [选项] 文件名 常用选项:-d 解压缩 压缩命令:bzip2 [选项] 文件名…...
没有钱怎么创业?一分钱没有如何能创业成功?
限制人创业成功的从来都不是资金,而是能力,这个道理很多人都可能不懂,多数人习惯了庸庸碌碌、日复一日地打工行为,却不知如何创业,那么,没有钱怎么创业?一分钱没有如何能创业成功呢?…...
【操作系统原理实验】银行家算法模拟实现
选择一种高级语言如C/C等,编写一个银行家算法的模拟实现程序。1) 设计相关数据结构;2) 实现系统资源状态查看、资源请求的输入等模块;3) 实现资源的预分配及确认或回滚程序;4) 实现系统状态安全检查程序;5) 组装各模块…...
java医院云HIS系统:融合B/S版电子病历系统 能与公卫、PACS等各类外部系统融合
医院HIS系统源码 云HIS系统源码:SaaS运维平台完整文档 有源码,有演示 java基层医院云his系统 融合B/S版电子病历系统,支持电子病历4级 拥有自主知识产权。 看演示及源码可私信我哦! 一、系统概述 一款满足二甲医院、基层医疗机构…...
单线激光雷达(SICK)驱动安装及时空标定
一、引言 1、AGV需要同时具备定位、避障与导航的功能,其中避障对于雷达本身的分辨率、精度要求并不是很高,只需要能够根据预设定的雷达扫描范围准确避开障碍物即可,故本文以TIM240(SICK激光类雷达)为例介绍实现多雷达…...
Java IO流
Java IO流 文章目录Java IO流什么是IO流InputStreamFlieInputStream示例OutputStream示例字符的读取与写入READER方法WRITER方法利用Scanner和PrintWriter简化字符的读写ScannerPrintWriter什么是IO流 前面我们介绍了Java中对文件的操作以及file类的了解,但是file类…...
LeetCode - 1653 使字符串平衡的最少删除次数
目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 1653. 使字符串平衡的最少删除次数 - 力扣(LeetCode) 题目描述 给你一个字符串 s ,它仅包含字符 a 和 b 。 你可以删除 s 中任意数目的字符,使得 …...
【微信小程序】-- 页面事件 - 上拉触底 - 案例(二十七)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
《超导电子技术及其应用》学习日志(二)
约瑟夫森效应 约瑟夫森理论 约瑟夫森方程 (1)每一个库柏对都可视为质量为2m、电量为2e的复合载流子,定向运动速度v就是库柏相对质心的速度。处于超导态的库柏对凝聚于同一量子态,运载电流时具有完全相同的动量P。用微观波函数来…...
微信小程序this指向问题
前言 最近在开发微信小程序时不时会遇到一个很奇怪的问题,有些情况下用 this.setData 可以改变视图显示,有些情况下使用 this.setData 无效,这又是为什么呢? 问题描述 在解释这个问题前,我们先来看两段代码࿱…...
【报错】paddle相关报错和处理方法
1 报错 😱😱😱 ModuleNotFoundError: No module named paddle 2 解决方法 💉💉💉 pip --default-timeout=100 install paddlepaddle -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 🎉🎉🎉🎉🎉🎉 1 报错 😱😱😱 from paddl…...
unity的安装配置和第一个游戏-unity开学第一课
许多的小伙伴学编程语言其实是因为玩游戏,玩着玩着就想写游戏了,于是开始学习c学习C#学习java,但相比之下C#的操作会更加容易,所以就开始学习unity来编游戏了。这里就就算是unity开学第一课啦-unity的安装配置和第一个游戏。 文章…...
Elsevier上传LaTeX 修改稿踩坑
背景 千辛万苦修改完论文,结果发现要求上传可编辑文件,tex上传真的太难了,一堆坑,尤其是编译错误,要等系统创建pdf后才能找到。中间还打了北京的客服电话,结果他们那边并不懂相关的东西。说latex是第三方公…...
秒懂算法 | 搜索基础
本篇介绍了BFS和DFS的概念、性质、模板代码。 01、搜索简介 搜索,就是查找解空间,它是“暴力法”算法思想的具体实现。 暴力法(Brute force,又译为蛮力法):把所有可能的情况都罗列出来,然后逐一检查,从中找到答案。这种方法简单、直接,不玩花样,利用了计算机强大的…...
Flutter 自定义今日头条版本的组件,及底部按钮切换静态样式
这里写目录标题1. 左右滑动实现标题切换,点击标题也可实现切换;2. 自定义KeepAliveWrapper 缓存页面;2.2 使用3. 底部导航切换;4. 自定义中间大导航;5.AppBar自定义顶部按钮图标、颜色6. Tabbar TabBarView实现类似头条…...
SpringBoot学习笔记(二)配置文件
1、配置文件SpringBoot使用一个全局的配置文件,配置文件名是固定的;application.propertiesapplication.yml配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;YAML:以数…...
09说说乐观锁和悲观锁
乐观锁和悲观锁是在并发编程中经常用到的两种锁机制。悲观锁是指在访问共享资源之前,会先加锁,以防止其他线程修改该资源,从而保证数据的一致性和完整性。在使用悲观锁时,如果一个线程已经占用了该资源,那么其他线程只…...
【C++】vector的模拟实现
文章目录1.查看STL源码2.vector的模拟实现1. 构造函数无参构造构造n个 val迭代器模板2. reserve3. 迭代器4.pop_back 尾删5.resize6.push_back7.insert迭代器失效—— pos为野指针迭代器失效——修改迭代器位置8. erase对于VS和Linux环境测试3.深浅拷贝问题4. 整体代码实现1.查…...
THUPC-2023 游记
清华校赛,战火重燃 原文链接 宣传图 上周四同学在洛谷无意间看到了宣传图,当时很有感触。不知觉间,又是一年春,又是一场触动心弦的 THUPC 了。 周五的团建过于有趣,致使我完全将 THUPC 抛之脑后了。 周日上午被省选…...
做视频投稿赚钱的网站好/网络推广需要花多少钱
这个例程比较简单,写这篇博客主要时为了做一些简单的记录,以防止后面遇到浪费不必要的时间。 这个例程包含读入CSV数据,对数据进行归一化处理,然后创建简单的神经网络,训练然后预测。 package org.deeplearning4j.…...
企业网站建设的方案ppt/沈阳网络营销推广的公司
添加一个maven管理的工程后,需要配置jdk,但是右键工程的属性后,没有出现java path build。 网上查了一下,总结方法如下:找到工程下的.project文件,打开,添加红色框图中的内容。 最后,…...
新手做那些网站比较好/怎么样推广自己的网站
不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述&#…...
如何做网站定位/百度搜索资源平台提交
讲解第一模块思维导图(口述5分钟)1. 分别解释"","",""的含义(口述)(1分钟)赋值逻辑判单累加,右边赋值到左边2. 两个变量值的关系?(口述)(1分钟)- n1 123456- n2 n1n1的值123456赋给了n2,如果n1的值被从新赋值…...
广州机械网站建设/营销app
工作窃取在本系列的第一部分中,您学习了足够JavaScript和CSS来使动画角色在浏览器中移动。 在本文中,我将探讨一些计算机游戏技术,这些技术将使我们能够对多个精灵进行动画处理,并使它们彼此交互。 如果您想在家中试用此代码&…...
wordpress隐藏菜单/推广公司品牌
一、在上一篇博客中,我们已经安装配置成功Maven,并且建立一个基于Maven的web项目,并且导入mahout依赖。 问题:在网上找到的两个例子ChartTwo与Collaborative Filtering中均没有用Maven建立项目,直接用Mahout。那我们这里为啥要用…...