使用Jasypt加密Spring配置文件及其注意事項

技術(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容