前言

配置文件中的敏感信息(数据库密码等)直接明文写在配置中,对安全来说,是一个很大的挑战。一旦信息泄漏,将会带来很大的安全隐患。尤其在一些对安全性要求很高的场景,因此我们就考虑如何对密码进行加密。本方案着重介绍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、尽量不要使用启动时直接写入的方式。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐