Springboot 配置文件加解密


功能介紹

在Spring boot開發過程中,需要在配置文件里配置許多信息,如數據庫的連接信息等,如果不加密,傳明文,數據庫就直接暴露了,相當於"裸奔"了,因此需要進行加密處理才行。

在項目中使用jasypt-1.9.4.jar包,能夠實現對明文進行加密,對密文進行解密。配置相關加密信息,就能夠實現在項目運行的時候,自動把配置文件中已經加密的信息解密成明文,供程序使用

使用說明

1.pom引入依賴

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

2.配置文件application.yaml

******************加解密相關配置*******************
jasypt:
    encrytor:
        #用來加解密的salt值
        password: 123456
        #用來使用新的算法,默認為org.jasypt.salt.NoOPIVGenerator,這樣的話我們就無法使用命令行中生成的密文
        ivGeneratorClassname: org.jasypt.salt.RandomIVGenerator

 

參數解釋:

  • password:加密時候要使用salt值
  • 對於ivGeneratorClassname,jara包中封裝類默認為org.jasypt.salt.NoOpIVGenerator,這個時候我們如果使用Junit生成密文,那么只會生成24位密鑰,與命令行中用命令生成的不一樣,后面會詳細講解。

 3.代碼解析

 首先我們需要知道的事加解密的方法,只有知道了如何加密才能夠在配置文件中設置相關參數的密文,這里涉及到兩種方式的加密:

a.命令行加密

 如果我們項目上線了,需要修改配置文件中的信息,這個時候我們可能要通過命令行的方式去加密(前提:保證你的salt值和你的項目中定義的一致

I.找到maven倉庫本地地址,如:C:\Users\kfzx-xuming\.m2\repository 在這里面找到jasypt-1.9.4.jar所在位置

II.進入文件夾,運行cmd命令

加密: java -cp jasypt-1.9.4.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=pass1234 password=12345 algorithm=PBEWithMD5AndDES

參數說明:

  • input:加上需要加密的明文
  • password:加上salt值(需要和項目中的application.yaml的password 一致)
  • algorithm:加上加密算法(默認使用的就是PBEWithMD5AndDES)

 這個時候我們可以看到下面的加密結果:

下面的output中就是我們對明文pass1234使用salt值為12345加密的結果

解密:java -cp jasypt-1.9.4.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input=pdFVCKrYnVOkTpeJ+081g70kzVWV2aLrTOK2EjrJkkSNMbu4C4IX+Q== password=12345 algorithm=PBEWithMD5AndDES

這個時候我們可以看到解密結果:

b.在eclipse中用Junit運行代碼對明文加密解密

前提已經在配置文件中配置了jasypt相關信息

jasypt提供了封裝類StringEncryptor,可以通過代碼來加解密,我們可以使用這個類運行相關方法

Junit相關代碼:

import org.jasypt.encryption.StringEncryptor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import static sun.plugin.javascript.navig.JSType.Embed;
 
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class JasyptTest {
 
    @Autowired
    StringEncryptor encryptor;
    //加密
    @Test
    public void getPass(){
        String name = encryptor.encrypt("hello");
        System.out.println("加密結果:"+name);//解密
    @Test
    public void passDecrypt(){
        String username = encryptor.decrypt("7uBC9fVLpL05ipEPzgsDT6Qcjuq9HvDYc0VUIgP4hY=");
        System.out.println("解密結果:"+username);
    }
}

 

 運行結果如下:

這個時候我們就得到了想要的密文,直接粘貼到配置文件中即可

使用方法如下:

 I.在配置文件application.yaml相關位置把明文替換成密文,用ENC()包裹:

************** 加解密相關測試配置信息***************
test:
    code:
        username: ENC(pdFVCKrYnVOkTpeJ+081g70kzVWV2aLrTOK2EjrJkkSNMbu4C4IX+Q==)

 

 II.在相應的位置直接讀取使用即可,下面我們寫一個controller類測試一下運行解密的效果:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@Controller
public class JasyptController {
 
     @Value("${cmd.username}")
    private String cmdUsername;
 
    @RequestMapping("/hello")
    public String testJasypt() {
        return cmdUserName;
    }
}

 

 這個時候我們啟動項目就能夠看到我們再配置中設置的密文對應的明文

 

至此配置文件的加解密的使用方法就介紹完了

 

4.補充說明

 對於上述配置文件中的ivGeneratorClassname再進行一個詳細的介紹

對於上述的Junit中使用的StringEncryptor封裝類,他是可以通過讀取配置文件中的信息進行加解密相關參數進行初始化,通過閱讀遠嗎,我們可以發現,初始化config的時候會跳轉到如下的地方進行設置:

如果在配置參數中沒有設置ivGeneratorClassname,那么默認就是org.jasypt.salt.NoOpIVGenerator,那么在運行加解密的時候就會生成一個24位的密文,如圖:

 

但是我們可以看到上面用命令行生成的卻比這個廠,這個時候如果我們把命令行中生成的密文粘貼到配置文件中則springboot就會啟動不了,Junit也會報錯解析,把這個密文用命令解析發現也會報錯

這個說明命令行中的加解密不是通過StringEncryptor類來操作的,那是走那邊的呢?

通過查閱資料我們發現了下面的代碼:

package cn.linjk.ehome;
 
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.junit.Test;
 
public class JasyptTest {
    @Test
    public void testEncrypt() throws Exception {
        StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();
 
        config.setAlgorithm("PBEWithMD5AndDES");          // 加密的算法,這個算法是默認的
        config.setPassword("12345");                        // 加密的密鑰
        standardPBEStringEncryptor.setConfig(config);
        String plainText = "hello";
        String encryptedText = standardPBEStringEncryptor.encrypt(plainText);
        System.out.println(encryptedText);
    }
}

 

這個時候我們運行一下,得到下面的結果:

把這個密文用命令進行解密發現也是成功的,查看源碼(下圖):可以看出,命令行如果沒有設置ivGeneratorClassname那么默認就會new RandomIVGenerator,就是這一步導致了生成了不一樣的密文:

綜上所述,結合場景,如果我們是項目需要上線了,不方便運行Junit去生成密文,填入配置文件,需要用命令行對明文加密,那一定要在配置文件中設置ivGeneratorClassname值!!!

 

公司電腦沒有辦法用外網上,圖片用手機拍的,如果感覺模糊,請見諒,大家相互學習~~~~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM