Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密

本文主要是介绍Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker+Git+Maven的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密

  • 1、前言
  • 2、什么是Jasypt
  • 3、什么是Jasypt-Spring-Boot
  • 4、接入初体验
    • 4.1 yml配置方式
    • 4.2 自定义配置类方式
    • 4.3 开始测试
    • 4.4 修改mysql参数加密
  • 5、使用JVM启动参数设置密钥
  • 6、加密和解密数据库字段
  • 7、结语

1、前言

在我们日常开发中,很多时候为了保证数据的安全,在处理敏感数据前后端数据传输数据库敏感数据入库等,数据的加密和解密是不可忽视的重要环节,特别是一些政企项目这点就尤为重要,避免每一次安全审计后反复的调整,所以在系统设计之初我们就应当把数据安全的问题考虑进去!

今天博主就给大家详细介绍Jasypt-Spring-Boot的功能,并展示如何在Spring Boot项目中实现各种加解密操作

2、什么是Jasypt

Jasypt(Java Simplified Encryption)是一个用于加密和解密数据的Java库。它提供了简单易用的API,可以轻松地将加密功能集成到Java应用程序中。Jasypt支持多种加密算法,并且可以保护各种类型的数据,包括文本、配置文件和数据库字段等。

3、什么是Jasypt-Spring-Boot

Jasypt-Spring-Boot是一个用于在Spring Boot应用程序中集成Jasypt的Starter。通过使用Jasypt-Spring-Boot,我们可以轻松地在Spring Boot项目中配置和使用Jasypt的加解密功能。
目前该库已经有2.8K的Star,且目前最新版本是 3.0.5
在这里插入图片描述

GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot

4、接入初体验

在开始接入前首先构建我们的 Spring Boot 项目, 引入相关依赖

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>

4.1 yml配置方式

修改 Spring Boot 配置文件,增加密钥

jasypt:encryptor:password: 123456

Spring Boot 启动类上 或配置类Configuration类上追加 @EnableEncryptableProperties注解

具体参数说明可以查看以下表格

配置项必填默认值说明
jasypt.encryptor.password设置密钥
jasypt.encryptor.algorithmPBEWITHHMACSHA512ANDAES_256设置算法
jasypt.encryptor.key-obtention-iterations1000设置密钥生成的迭代次数
jasypt.encryptor.pool-size1设置加密池的大小
jasypt.encryptor.provider-nameSunJCE设置加密提供者名称
jasypt.encryptor.provider-class-namenull设置加密提供类名
jasypt.encryptor.salt-generator-classnameorg.jasypt.salt.RandomSaltGenerator设置盐值生成器的类名
jasypt.encryptor.iv-generator-classnameorg.jasypt.iv.RandomIvGenerator设置初始化向量生成器的类名
jasypt.encryptor.string-output-typebase64设置输出字符串的编码方式
jasypt.encryptor.proxy-property-sourcesfalse
jasypt.encryptor.skip-property-sourcesempty list

最后一个属性jasypt.encryptor.proxy-property-sources用于指示jasyp-spring-boot如何拦截属性值以进行解密

  • 默认值false使用PropertySourceEnumerablePropertySourceMapPropertySource的自定义包装器实现。
  • 当为该属性指定true时,拦截机制将在每个特定的PropertySource实现上使用CGLib代理。这在某些必须保留原始PropertySource类型的场景中可能很有用

4.2 自定义配置类方式

创建一个自定义配置类:Bean名称为: jasyptStringEncryptor

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableEncryptableProperties
public class StringEncryptorConfig {@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("password");config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

温馨提示

  • 在自定义StringEncryptor的时候,会覆盖默认的加密器,且Bean名称固定为 jasyptStringEncryptor
  • 如果你需要自定义Bean名称,则需要在springboot配置文件追加
    jasypt.encryptor.bean = your encryptorBean Name

如下面自定义自定义Bean名称

    @Bean("encryptorBean")public StringEncryptor stringEncryptor() {//参考上面的配置参数...}

4.3 开始测试

我们现在来编写一个测试类,来体验加解密的效果

	@Resource(name = "jasyptStringEncryptor")private StringEncryptor stringEncryptor;@Testpublic void testJasypt() {String mysqlRoot = stringEncryptor.encrypt("root");String mysqlPassword = stringEncryptor.encrypt("123456");System.out.println("mysqlroot加密后:"+mysqlRoot);System.out.println("mysqlPassword加密后:"+mysqlPassword);System.out.println("===================");System.out.println("mysqlRoot解密后:"+ stringEncryptor.decrypt(mysqlRoot));System.out.println("mysqlPassword解密后:"+ stringEncryptor.decrypt(mysqlPassword));}

测试输出如下:
在这里插入图片描述

4.4 修改mysql参数加密

我们已经获得了mysql加密后的账号以及密码,现在我们来给mysql配置的明文账户密码改一下

加密格式:默认的前后缀是 ENC() 括号里是密文

# 数据源配置
spring:#数据源配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:url: jdbc:mysql://localhost:3306/docker_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8# 未加密前#username: root#password: 123456# 加密后username: ENC(TBTl1fiJ7tilJ91sEdym6G8vEQG7Wn3QhIBU77mrfzCtqkHPMEMAihvpjokqUgMP)password: ENC(9galEBTwYzgGG6ER3oY+k45463tkvYSnt+epH8SE/hldbi13hg3+XL7CPKpgJAQp)

启动SpringBoot项目。观察控制台输出,数据库是否完成连接初始化,且项目启动成功!

在这里插入图片描述

特别说明
小伙伴发现了在mysql的配置中,我们使用 ENC() 来包裹我们的密文,这个前后缀是可以修改的,如MICRO()

修改配置文件方式

jasypt:encryptor:property:prefix: "MICRO["suffix: "]"

编码方式

我们可以通过创建一个名为 encryptablePropertyDetector 类型为 EncryptablePropertyDetector 的Bean来覆盖默认实现,如果你需要修改默认名称,需要覆盖属性 jasypt.encryptor.property.detector-bean 并指定您希望给予bean的名称

private static class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {@Overridepublic boolean isEncrypted(String value) {if (value != null) {return value.startsWith("MICRO");}return false;}@Overridepublic String unwrapEncryptedValue(String value) {return value.substring("MICRO".length());}
}
@Bean(name = "encryptablePropertyDetector")public EncryptablePropertyDetector encryptablePropertyDetector() {return new MyEncryptablePropertyDetector();}

5、使用JVM启动参数设置密钥

在我们 YML 配置方式中, jasypt.encryptor.password=123456 是明文的,有小伙伴会问,哎呀这不也是暴露了加密密钥么? 要解决这个问题,我们可以使用JVM启动参数设置

在IDEA项目里 ,点击 Edit Configurations ,添加 VM 启动参数 -Djasypt.encryptor.password=123456
在这里插入图片描述
在这里插入图片描述
在生产环境部署jar包的时候,可以使用如下命令启动:

java -jar your-project.jar --jasypt.encryptor.password=password

6、加密和解密数据库字段

在我们公司某些项目中,用户的敏感信息是不允许明文存储数据库的,比如手机号、身份证等,接下来我们来演示如何在实体类中使用Jasypt进行数据库字段实现加解密

注意引入JPA支持 spring-boot-starter-data-jpa

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import org.jasypt.util.text.AES256TextEncryptor;@Component
@Converter
public class EncryptedStringConverter implements AttributeConverter<String, String> {@Resource(name = "jasyptStringEncryptor")private StringEncryptor stringEncryptor;@Overridepublic String convertToDatabaseColumn(String attribute) {return stringEncryptor.encrypt(attribute);}@Overridepublic String convertToEntityAttribute(String dbData) {return stringEncryptor.decrypt(dbData);}
}

然后在实体类中使用这个转换器

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Convert(converter = EncryptedStringConverter.class)@Column(name = "password")private String password;// Getters and Setters
}

7、结语

Jasypt-Spring-Boot是一个强大且易于使用的工具,可以在Spring Boot应用程序中实现加密和解密操作。通过本文的介绍,我们了解了如何在Spring Boot项目中配置和使用Jasypt,并展示了各种加解密操作的实现方法。

下一篇我们将针对Jasypt整合升级一下,使用自定义注解和AOP实现敏感数据加解密,点点关注更新不迷路哦~


在这里插入图片描述

这篇关于Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034504

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程