技术公众号:Java In Mind(Java_In_Mind),欢迎关注!
问题
在我们的应用程序,为了防止hardcode,通常会把程序中可能会变的,或者与环境相关的信息抽离出来,从而形成配置文件。
在Java应用中通常就是properties文件或者yml文件之类的,但是这部分信息由于抽离独立开来将会变得比较容易泄露,而配置文件中往往含有比较敏感的信息,例如,数据库密码,这些数据一旦泄露有可能造成严重的后果;那么自然而然的,我们就会想到对配置文件的敏感信息进行加密。
Jasypt简介
Jasypt(Java Simplified Encryption),一个用于加密的Java类库,目的就是让开发者很简便的将加密功能引入自己的项目中来,而不需要去明白具体的加密知识,其有如下特点:
- 基于标准的加密算法,支持单向加密与反向加解密
- 与Hibernate可以无缝集成
- 适用于使用Spring应用的基础,与SpringSecurity可以实现无缝集成
- 提供加密应用的配置文件的集成
- 提供多处理器/多核系统中高性能加密的特定功能
- 开放与任何JCE(Java Cryptography Extension)实现相同的API
Spring Boot集成Jasypt加密配置文件
配置
SpringBoot集成Jasypt配置很简单,只需引入依赖,然后配置Jasypt相关属性参数即可:
- Maven
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
- 配置文件加密
# 如配置,application.properties
application.author=ENC(9afnWGGYyzZN38vYYfYx1ZM9ql//Vp+8)
- 启动应用时,配置系统属性
java -jar foo.jar -Djasypt.encryptor.password=HelloWorld
加密
那么,配置文件中的加密密文该如何获取呢?Jasypt官方提供了CLI工具,通过脚本可以生成对应的密文,具体操作如下:
从Github下载Jasypt:https://github.com/jasypt/jasypt
解压进入
/bin
目录-
根据需要执行对应脚本
例如,本例子的密文生成,默认使用
PBEWithMD5AndDES
算法:$ sh encrypt.sh input=sevenlin password=HelloWorld ----ENVIRONMENT----------------- Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.73-b02 ----ARGUMENTS------------------- input: sevenlin password: HelloWorld ----OUTPUT---------------------- lUmhU/2EgreTZVdtWFCnqE86tXuo6OMp
-
或者,自己写个简单的类来生成
public class EncryptDemo { public static void main(String[] args) { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); encryptor.setPassword("HelloWorld"); String enc = encryptor.encrypt("sevenlin"); System.out.println(enc); } }
使用&验证
-
写个Service验证
@Service @Slf4j public class JasyptDemoService { @Value("${application.author}") private String author; @PostConstruct public void print() { log.info("==================================================================="); log.info("application.author:{}", author); log.info("==================================================================="); } //... }
-
结果,验证成功:
=================================================================== application.author:sevenlin ===================================================================
注意事项
使用时将密钥与密文分开配置
我看过有的在使用Jasypt的时候,将密钥与密文都放在一个配置文件里,那不等于把钥匙放在门口一样的意思么,虽然加密了,但是只要配置文件泄露了,那么就可以通过密钥来实现解密,达不到保护敏感信息的目的,可以有以下几种方式来配置密钥:
系统属性:
java -jar foo.jar -Djasypt.encryptor.password=HelloWorld
运行参数:
java -jar foo.jar --jasypt.encryptor.password=HelloWorld
-
环境变量
# Linux vim /etc/profile export jasypt.encryptor.password=HelloWorld # Windows 系统->更改设置->高级->环境变量->新增:jasypt.encryptor.password=HelloWorld
其他配置项
Key(配置项) | Required(必须) | Default Value(默认值) |
---|---|---|
jasypt.encryptor.password | True | - |
jasypt.encryptor.algorithm | False | PBEWithMD5AndDES |
jasypt.encryptor.keyObtentionIterations | False | 1000 |
jasypt.encryptor.poolSize | False | 1 |
jasypt.encryptor.providerName | False | SunJCE |
jasypt.encryptor.providerClassName | False | null |
jasypt.encryptor.saltGeneratorClassname | False | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.ivGeneratorClassname | False | org.jasypt.iv.NoIvGenerator |
jasypt.encryptor.stringOutputType | False | base64 |
jasypt.encryptor.proxyPropertySources | False | false |
其他的可以详看配置类:
com.ulisesbocchio.jasyptspringboot.properties.JasyptEncryptorConfigurationProperties