😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker+Git+Maven的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密
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.algorithm否PBEWITHHMACSHA512ANDAES_256设置算法jasypt.encryptor.key-obtention-iterations否1000设置密钥生成的迭代次数jasypt.encryptor.pool-size否1设置加密池的大小jasypt.encryptor.provider-name否SunJCE设置加密提供者名称jasypt.encryptor.provider-class-name否null设置加密提供类名jasypt.encryptor.salt-generator-classname否org.jasypt.salt.RandomSaltGenerator设置盐值生成器的类名jasypt.encryptor.iv-generator-classname否org.jasypt.iv.RandomIvGenerator设置初始化向量生成器的类名jasypt.encryptor.string-output-type否base64设置输出字符串的编码方式jasypt.encryptor.proxy-property-sources否falsejasypt.encryptor.skip-property-sources否empty list
最后一个属性
jasypt.encryptor.proxy-property-sources
用于指示
jasyp-spring-boot
如何拦截属性值以进行解密
- 默认值
false
使用PropertySource
、EnumerablePropertySource
和MapPropertySource
的自定义包装器实现。- 当为该属性指定
true
时,拦截机制将在每个特定的PropertySource
实现上使用CGLib
代理。这在某些必须保留原始PropertySource
类型的场景中可能很有用
4.2 自定义配置类方式
创建一个自定义配置类:Bean名称为:
jasyptStringEncryptor
importcom.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;importorg.jasypt.encryption.StringEncryptor;importorg.jasypt.encryption.pbe.PooledPBEStringEncryptor;importorg.jasypt.encryption.pbe.config.SimpleStringPBEConfig;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@Configuration@EnableEncryptablePropertiespublicclassStringEncryptorConfig{@Bean("jasyptStringEncryptor")publicStringEncryptorstringEncryptor(){PooledPBEStringEncryptor encryptor =newPooledPBEStringEncryptor();SimpleStringPBEConfig config =newSimpleStringPBEConfig();
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")publicStringEncryptorstringEncryptor(){//参考上面的配置参数...}
4.3 开始测试
我们现在来编写一个测试类,来体验加解密的效果
@Resource(name ="jasyptStringEncryptor")privateStringEncryptor stringEncryptor;@TestpublicvoidtestJasypt(){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.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid: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的名称
privatestaticclassMyEncryptablePropertyDetectorimplementsEncryptablePropertyDetector{@OverridepublicbooleanisEncrypted(String value){if(value !=null){return value.startsWith("MICRO");}returnfalse;}@OverridepublicStringunwrapEncryptedValue(String value){return value.substring("MICRO".length());}}
@Bean(name ="encryptablePropertyDetector")publicEncryptablePropertyDetectorencryptablePropertyDetector(){returnnewMyEncryptablePropertyDetector();}
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
importjavax.persistence.AttributeConverter;importjavax.persistence.Converter;importorg.jasypt.util.text.AES256TextEncryptor;@Component@ConverterpublicclassEncryptedStringConverterimplementsAttributeConverter<String,String>{@Resource(name ="jasyptStringEncryptor")privateStringEncryptor stringEncryptor;@OverridepublicStringconvertToDatabaseColumn(String attribute){return stringEncryptor.encrypt(attribute);}@OverridepublicStringconvertToEntityAttribute(String dbData){return stringEncryptor.decrypt(dbData);}}
然后在实体类中使用这个转换器
importjavax.persistence.Column;importjavax.persistence.Convert;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;@EntitypublicclassUser{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;@Convert(converter =EncryptedStringConverter.class)@Column(name ="password")privateString password;// Getters and Setters}
7、结语
Jasypt-Spring-Boot
是一个强大且易于使用的工具,可以在
Spring Boot
应用程序中实现加密和解密操作。通过本文的介绍,我们了解了如何在
Spring Boot
项目中配置和使用
Jasypt
,并展示了各种加解密操作的实现方法。
下一篇我们将针对
Jasypt
整合升级一下,使用自定义注解和AOP实现敏感数据加解密,点点关注更新不迷路哦~
版权归原作者 Micro麦可乐 所有, 如有侵权,请联系我们删除。