沉吟久,怕君恩未许,此意徘徊。
1 前言
在分布式开发中,如何确保敏感信息的安全性已成为重中之重,特别是在配置文件中,数据库连接信息、API 密钥等都是潜在的泄露风险。为了解决这些问题,Jasypt(Java Simplified Encryption)为开发者提供了一种简单且安全的加密和解密解决方案。
前段时间在做项目重构,在整理项目的配置文件时遇到了一个问题,数据库连接的账户密码都被加密了。采用的是 jasypt
加解密,之前还没有实践过这样的 ENC(xxxx)
的方式,了解和实践了一番之后,有了一些心得和经验,在这里给大家做一个分享。
2 项目准备
在使用 jasypt
之前,首先需要在 pom
文件中引入相关的依赖,jasypt-spring-boot-starter
是为了在项目启动时解密密文内容,jasypt-maven-plugin
是为了使用 maven
在命令行中执行加密和解密,当然这些操作可以在 java
代码中实现。
xml
<!-- jasypt 加解密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!-- jasypt 编译插件 jasypt.encryptor.password=test -->
<plugin>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-maven-plugin</artifactId>
<version>3.0.5</version>
</plugin>
3 jasypt 介绍
Jasypt
默认使用的算法是 PBEWithMD5AndDES
, 其加密密钥是解密敏感信息的关键,需要确保密钥的安全存放。推荐使用环境变量、密钥管理服务或安全的配置中心来存储密钥,而非硬编码在项目中。
在使用Jasypt
时,需要先使用代码或者命令行的模式,加密密码或者敏感信息等内容。通常情况下使用 BasicTextEncryptor
来进行加密或者解密内容,如下图所示:
java
// 配置加密所需的密码
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword("password");
// 解密密文
String decryptedText = textEncryptor.decrypt("密文");
// 加密内容
String decryptedText = textEncryptor.encrypt("待加密明文");
如果对默认的加密方式或者算法有异议,可以采用PooledPBEStringEncryptor
的方式来生成 StringEncryptor
,可以自定义加密的密码,加密算法以及密钥的迭代次数。
java
@Bean
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
// 配置加密密钥,务必保密
config.setPassword("passowrd");
// 设置加密算法
config.setAlgorithm("PBEWithMD5AndDES");
// 设置密钥迭代次数,影响破解难度
config.setKeyObtentionIterations("10");
// 设置加密池的大小,1 表示单个实例使用
config.setPoolSize("1");
// 盐生成器类,防止彩虹表攻击
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
// 设置输出编码类型为 base64
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
4 jasypt 实践
首先需要在命令行中执行命令,生成密文或者解密明文,命令如下所示:
ini
# jasypt:encrypt-value 加密密文
# jasypt.encryptor.password 是加密需要的密码
# jasypt.plugin.value 是需要加密的密文
mvn jasypt:encrypt-value -Djasypt.encryptor.password="123456" -Djasypt.plugin.value="root123456!"
# 使用 jasypt:decrypt-value 解密密文
mvn jasypt:decrypt-value -Djasypt.encryptor.password="123456" -Djasypt.plugin.value="密文"
同样的,也可以使用 BasicTextEncryptor
的方式在 java
代码中实现内容的加密或者解密。
在启动项目时,需要指定解密的密码。有两种方式,其一是在执行启动命令时指定密码,其二是项目配置文件中配置解密密码,如下所示:
java
# 启动项目时指定密码
java -Djasypt.encryptor.password=passowrd -jar myapp.jar
# 在项目中配置解密密码
jasypt.encryptor.password=passowrd
5 总结
在本文中,主要通过项目实践介绍了 jasypt
的使用方式,通过这种加解密工具,可以使得项目中的某些敏感信息进行加密,防止信息的泄露。之前在文章中介绍了 apollo
作为配置中心的内容,如果条件允许可以使用 apollo
的加密解密功能,可以实现同样的目的。