【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集成Elasticsearch搜索引擎
[SpringBoot高级篇]SpringBoot集成Elasticsearch搜索引擎 1. 什么是Elasticsearch? 2. 安装并运行Elasticsearch 2.1 拉取镜像 2.2 ...
- 【SpringBoot高级篇】SpringBoot集成MongDB数据库
[SpringBoot高级篇]SpringBoot集成MongDB数据库 MongoDB是什么 ? 主要特点 MongoDB管理 工具 MongoDB 基本概念 数据库 文档(Document) 集合 ...
- 【SpringBoot高级篇】springboot实现上传docdocx文件格式转html在线预览v2.0
[SpringBoot高级篇]springboot实现上传doc&docx文件格式转html在线预览v2.0 pom 上传路径工具类 SpringMvc虚拟路径映射 doc转html工具类 d ...
- SpringBoot中利用自定义注解优雅地实现隐私数据脱敏(加密显示)
前言 这两天在整改等保测出的问题,里面有一个"用户信息泄露"的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏. 数据脱敏:把系统里的一些敏感数据 ...
- 【SpringBoot高级】SpringBoot整合篇
SpringBoot整合篇
- SpringBoot高级篇JdbcTemplate之数据查询上篇
前面一篇介绍如何使用JdbcTemplate实现插入数据,接下来进入实际业务中,最常见的查询篇.由于查询的姿势实在太多,对内容进行了拆分,本篇主要介绍几个基本的使用姿势 queryForMap que ...
- SpringBoot高级篇MongoDB之修改基本使用姿势
原文: 190218-SpringBoot高级篇MongoDB之修改基本使用姿势 本篇依然是MongoDB curd中的一篇,主要介绍document的更新,主要内容如下 常见类型成员的修改 数组类型 ...
- python个人数据脱敏_数据脱敏的处理方法及查询
[摘要] 关键词:集算器.SPL.数据脱敏.报表 1).数据脱敏是"指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.在涉及客户安全数据或者一些商业性敏感数据的情况下, ...
- PHP 数据脱敏显示,数据脱敏处理
什么是脱敏 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.简单来说就是你有些数据并不想让别人看见,需要进行处理再显示在页面上. 项目中如何脱敏数据 一般我们得到的数 ...
最新文章
- UE capability与 双连接相关的参数。
- Win7 MongoDB可视化工具Robo 3T 1.2.1(robomongo)的安装使用
- easyui filebox 文件上传
- Visual Studio 11 Beta 带来新的Metro 应用开发体验
- 这群理想主义者,在腾讯用10年做到了畅销榜第一
- 六、springboot(三)配置双数据源
- python编写脚本,删除固定用户下的所有表
- Google I/O 2018 之后, Android 工程师将何去何从?
- Oracle内存管理(五)
- UVa 1585 - Score
- 时间序列分析工具箱—— h2o + timetk
- [RK3399][Android7.1] Pinctrl的默认配置
- 2018 ideal 链接数据_利用 IDEA HTTP 请求文件访问 API 接口
- GA遗传算法介绍与实例
- 以分布式融合技术为突破口,易鲸捷奏响国产数据库“冲锋号”
- IAR 设置程序下载地址
- linux下搜索丢失分区,找回丢失的Linux分区拯救我的硬盘
- sumo之使用netedit绘制路网并进行简单模拟
- 从静态检查工具谈代码编程规范
- 油气开采上百年,技术依旧原始,硬伤在这儿