云原生之SpringBoot:Jasypt对SpringBoot用户密码进行加密和解密
Jasypt对SpringBoot用户密码进行加密和解密
前言
配置文件中的敏感信息(数据库密码等)直接明文写在配置中,对安全来说,是一个很大的挑战。一旦信息泄漏,将会带来很大的安全隐患。尤其在一些对安全性要求很高的场景,因此我们就考虑如何对密码进行加密。本方案着重介绍Jasypt对SpringBoot配置文件加密。
1、Jasypt是什么?
Jasypt 这个Java类包为开发人员提供一种简单的方式来为项目增加加密功能,包括:密码Digest认证,文本和对象加密,集成 hibernate,Spring Security(Acegi)来增强密码管理。
Jasypt是一个Java库,可以使开发者不需太多操作来给Java项目添加基本加密功能,而且不需要知道加密原理。
根据Jasypt官方文档,Jasypt可用于加密任务与应用程序,例如加密密码、敏感信息和数据通信、创建完整检查数据的sums. 其他性能包括高安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、文本、数字和二进制文件。
Jasypt也可以与Acegi Security整合也即Spring Security。Jasypt亦拥有加密应用配置的集成功能,而且提供一个开放的API从而任何一个Java Cryptography Extension都可以使用Jasypt。
官方参考文档:
https://github.com/ulisesbocchio/jasypt-spring-boot/tree/jasypt-spring-boot-parent-2.1.2
2、引入实现包
1、一般来说,只要引入jar包,就能自动实现配置文件加解密的功能,由于我们的项目采用的是xml注入参数的形式,所以根据jasypt文档描述,除了引入jar包,还需要改造启动类方式:
1、启动模块中pom需要引入
“配置加解密” 这个配置已经由适配层引入,在pom.xml
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
3、代码改造
现网有两种启动类代码,需要进行不同的改造操作。具体如下:
1、第一种:启动类代码只有一行
原有启动类:
SpringApplication.run(启动模块类名字.class, args);
替换为:
new SpringApplicationBuilder().environment(new StandardEncryptableEnvironment())
.sources(启动模块类名字).run(args);
2、第二种:启动类代码有多行
原有启动类:
ConfigurableApplicationContextapplicationContext=new SpringApplicationBuilder().environment(newStandardEncryptableEnvironment()).sources(启动模块类名字).run(args);
SpringContextHolder.initApplicationContext((ApplicationContext)applicationContext);
替换为:
try {
ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder().environment(new StandardEncryptableEnvironment()).sources(启动模块类名字).run(args);
SpringContextHolder.initApplicationContext((ApplicationContext)applicationContext);
}
catch (Exception e) {
LOGGER.error(e.getMessage());
}
4、加密解密
1、使用代码加解密:
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
//加密所需的salt(盐)
textEncryptor.setPassword("hxmec");
//要加密的数据(数据库的用户名或密码)
String username = textEncryptor.encrypt("dp");
String password = textEncryptor.encrypt("dp123456!");
System.out.println("username:"+username);
System.out.println("password:"+password);
2、使用jar包进行加解密:
注:jar包可从此处下载
使用jar命令加密方式:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="需要密码的明文" password=秘钥 algorithm=PBEWithMD5AndDES
指令里面的关键词:
- input:为需加密的明文参数。
- password : 是自己自定义的密钥。
- algorithm : 使用的加密算法。
加密算法:
PBEWITHMD5ANDDES、PBEWITHMD5ANDTRIPLEDES、PBEWITHSHA1ANDDESEDE、PBEWITHSHA1ANDRC2_40
使用jar命令解密方式:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="加密后的密码" password=秘钥 algorithm=PBEWithMD5AndDES
5、配置文件中使用加密后的密码
1、配置文件中需要将明文修改为以下的:
注意:密文用ENC()包起来
username: ENC(dvXWu4WYjqxHKBmApPNo6A==) 加密后的用户名称
password: ENC(Cbfgv3nG1jGoZXToQ6JdLZb1/D/0hzuG) 加密后的密码
6、秘钥保存方式:
1、配置文件中
jasypt:
encryptor:
password: test
2、保存在环境变量中
在机器中执行写入环境变量:
echo 'export JASYPT_PASSWORD=test' >> /etc/profile
source /etc/profile
在启动包时加入密码环境变量:
java -jar app-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=${JASYPT_PASSWORD}
3、启动时直接写入
java -Djasypt.encryptor.password=test -jar xxx.jar
写在最后
1、在使用过程中,配置的秘钥长度过长或者秘钥过于复杂会导致识别不了密码。
2、尽量不要使用启动时直接写入的方式。
更多推荐
所有评论(0)