技術(shù)公眾號:Java In Mind(Java_In_Mind),歡迎關(guān)注!
問題
在我們的應(yīng)用程序,為了防止hardcode,通常會把程序中可能會變的,或者與環(huán)境相關(guān)的信息抽離出來,從而形成配置文件。
在Java應(yīng)用中通常就是properties文件或者yml文件之類的,但是這部分信息由于抽離獨立開來將會變得比較容易泄露,而配置文件中往往含有比較敏感的信息,例如,數(shù)據(jù)庫密碼,這些數(shù)據(jù)一旦泄露有可能造成嚴(yán)重的后果;那么自然而然的,我們就會想到對配置文件的敏感信息進(jìn)行加密。
Jasypt簡介
Jasypt(Java Simplified Encryption),一個用于加密的Java類庫,目的就是讓開發(fā)者很簡便的將加密功能引入自己的項目中來,而不需要去明白具體的加密知識,其有如下特點:
- 基于標(biāo)準(zhǔn)的加密算法,支持單向加密與反向加解密
- 與Hibernate可以無縫集成
- 適用于使用Spring應(yīng)用的基礎(chǔ),與SpringSecurity可以實現(xiàn)無縫集成
- 提供加密應(yīng)用的配置文件的集成
- 提供多處理器/多核系統(tǒng)中高性能加密的特定功能
- 開放與任何JCE(Java Cryptography Extension)實現(xiàn)相同的API
Spring Boot集成Jasypt加密配置文件
配置
SpringBoot集成Jasypt配置很簡單,只需引入依賴,然后配置Jasypt相關(guān)屬性參數(shù)即可:
- 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)
- 啟動應(yīng)用時,配置系統(tǒng)屬性
java -jar foo.jar -Djasypt.encryptor.password=HelloWorld
加密
那么,配置文件中的加密密文該如何獲取呢?Jasypt官方提供了CLI工具,通過腳本可以生成對應(yīng)的密文,具體操作如下:
從Github下載Jasypt:https://github.com/jasypt/jasypt
解壓進(jìn)入
/bin目錄-
根據(jù)需要執(zhí)行對應(yīng)腳本
例如,本例子的密文生成,默認(rèn)使用
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("==================================================================="); } //... }
-
結(jié)果,驗證成功:
=================================================================== application.author:sevenlin ===================================================================
注意事項
使用時將密鑰與密文分開配置
我看過有的在使用Jasypt的時候,將密鑰與密文都放在一個配置文件里,那不等于把鑰匙放在門口一樣的意思么,雖然加密了,但是只要配置文件泄露了,那么就可以通過密鑰來實現(xiàn)解密,達(dá)不到保護(hù)敏感信息的目的,可以有以下幾種方式來配置密鑰:
系統(tǒng)屬性:
java -jar foo.jar -Djasypt.encryptor.password=HelloWorld運(yùn)行參數(shù):
java -jar foo.jar --jasypt.encryptor.password=HelloWorld-
環(huán)境變量
# Linux vim /etc/profile export jasypt.encryptor.password=HelloWorld # Windows 系統(tǒng)->更改設(shè)置->高級->環(huán)境變量->新增:jasypt.encryptor.password=HelloWorld
其他配置項
| Key(配置項) | Required(必須) | Default Value(默認(rèn)值) |
|---|---|---|
| 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