【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 配置脱敏和数据脱敏相关推荐

  1. 【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎

    [SpringBoot高级篇]SpringBoot集成Elasticsearch搜索引擎 1. 什么是Elasticsearch? 2. 安装并运行Elasticsearch 2.1 拉取镜像 2.2 ...

  2. 【SpringBoot高级篇】SpringBoot集成MongDB数据库

    [SpringBoot高级篇]SpringBoot集成MongDB数据库 MongoDB是什么 ? 主要特点 MongoDB管理 工具 MongoDB 基本概念 数据库 文档(Document) 集合 ...

  3. 【SpringBoot高级篇】springboot实现上传docdocx文件格式转html在线预览v2.0

    [SpringBoot高级篇]springboot实现上传doc&docx文件格式转html在线预览v2.0 pom 上传路径工具类 SpringMvc虚拟路径映射 doc转html工具类 d ...

  4. SpringBoot中利用自定义注解优雅地实现隐私数据脱敏(加密显示)

    前言 这两天在整改等保测出的问题,里面有一个"用户信息泄露"的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏. 数据脱敏:把系统里的一些敏感数据 ...

  5. 【SpringBoot高级】SpringBoot整合篇

    SpringBoot整合篇

  6. SpringBoot高级篇JdbcTemplate之数据查询上篇

    前面一篇介绍如何使用JdbcTemplate实现插入数据,接下来进入实际业务中,最常见的查询篇.由于查询的姿势实在太多,对内容进行了拆分,本篇主要介绍几个基本的使用姿势 queryForMap que ...

  7. SpringBoot高级篇MongoDB之修改基本使用姿势

    原文: 190218-SpringBoot高级篇MongoDB之修改基本使用姿势 本篇依然是MongoDB curd中的一篇,主要介绍document的更新,主要内容如下 常见类型成员的修改 数组类型 ...

  8. python个人数据脱敏_数据脱敏的处理方法及查询

    [摘要] 关键词:集算器.SPL.数据脱敏.报表 1).数据脱敏是"指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.在涉及客户安全数据或者一些商业性敏感数据的情况下, ...

  9. PHP 数据脱敏显示,数据脱敏处理

    什么是脱敏 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.简单来说就是你有些数据并不想让别人看见,需要进行处理再显示在页面上. 项目中如何脱敏数据 一般我们得到的数 ...

最新文章

  1. UE capability与 双连接相关的参数。
  2. Win7 MongoDB可视化工具Robo 3T 1.2.1(robomongo)的安装使用
  3. easyui filebox 文件上传
  4. Visual Studio 11 Beta 带来新的Metro 应用开发体验
  5. 这群理想主义者,在腾讯用10年做到了畅销榜第一
  6. 六、springboot(三)配置双数据源
  7. python编写脚本,删除固定用户下的所有表
  8. Google I/O 2018 之后, Android 工程师将何去何从?
  9. Oracle内存管理(五)
  10. UVa 1585 - Score
  11. 时间序列分析工具箱—— h2o + timetk
  12. [RK3399][Android7.1] Pinctrl的默认配置
  13. 2018 ideal 链接数据_利用 IDEA HTTP 请求文件访问 API 接口
  14. GA遗传算法介绍与实例
  15. 以分布式融合技术为突破口,易鲸捷奏响国产数据库“冲锋号”
  16. IAR 设置程序下载地址
  17. linux下搜索丢失分区,找回丢失的Linux分区拯救我的硬盘
  18. sumo之使用netedit绘制路网并进行简单模拟
  19. 从静态检查工具谈代码编程规范
  20. 油气开采上百年,技术依旧原始,硬伤在这儿

热门文章

  1. java资产管理系统源码_基于jsp的资产管理系统-JavaEE实现资产管理系统 - java项目源码...
  2. 详谈Lustre背后的故事,ZFS前世和今生
  3. how2heap2.31学习(2)
  4. js移动端页面判断是否是iphoneX,然后去设置元素对应高度?
  5. 30天自制操作系统U盘启动
  6. UGC社区敏感词过滤原理
  7. v4l2 spec 中文 Ch01
  8. jsbox 导入_JSBox - 体验
  9. 如何制作数码管显示程序
  10. 小波和小波变换(应试)