您好,登錄后才能下訂單哦!
功能介紹
大家都知道在Spring boot開(kāi)發(fā)過(guò)程中,需要在配置文件里配置許多信息,如數(shù)據(jù)庫(kù)的連接信息等,如果不加密,傳明文,數(shù)據(jù)庫(kù)就直接暴露了,相當(dāng)于"裸奔"了,因此需要進(jìn)行加密處理才行。
在項(xiàng)目中使用jasypt-1.9.4.jar包,能夠?qū)崿F(xiàn)對(duì)明文進(jìn)行加密,對(duì)密文進(jìn)行解密。配置相關(guān)加密信息,就能夠?qū)崿F(xiàn)在項(xiàng)目運(yùn)行的時(shí)候,自動(dòng)把配置文件中已經(jīng)加密的信息解密成明文,供程序使用
下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
使用說(shuō)明
1.pom引入依賴(lài)
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
2.配置文件application.yaml
******************加解密相關(guān)配置******************* jasypt: encrytor: #用來(lái)加解密的salt值 password: 123456 #用來(lái)使用新的算法,默認(rèn)為org.jasypt.salt.NoOPIVGenerator,這樣的話(huà)我們就無(wú)法使用命令行中生成的密文 ivGeneratorClassname: org.jasypt.salt.RandomIVGenerator
參數(shù)解釋?zhuān)?/strong>
3.代碼解析
首先我們需要知道的事加解密的方法,只有知道了如何加密才能夠在配置文件中設(shè)置相關(guān)參數(shù)的密文,這里涉及到兩種方式的加密:
a.命令行加密
如果我們項(xiàng)目上線(xiàn)了,需要修改配置文件中的信息,這個(gè)時(shí)候我們可能要通過(guò)命令行的方式去加密(前提:保證你的salt值和你的項(xiàng)目中定義的一致)
I.找到maven倉(cāng)庫(kù)本地地址,如:C:\Users\kfzx-xuming\.m2\repository 在這里面找到j(luò)asypt-1.9.4.jar所在位置
II.進(jìn)入文件夾,運(yùn)行cmd命令
加密:java -cp jasypt-1.9.4.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLIinput=pass1234password=12345algorithm=PBEWithMD5AndDES
參數(shù)說(shuō)明:
這個(gè)時(shí)候我們可以看到下面的加密結(jié)果:
下面的output中就是我們對(duì)明文pass1234使用salt值為12345加密的結(jié)果
解密:java -cp jasypt-1.9.4.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input=pdFVCKrYnVOkTpeJ+081g70kzVWV2aLrTOK2EjrJkkSNMbu4C4IX+Q== password=12345 algorithm=PBEWithMD5AndDES
這個(gè)時(shí)候我們可以看到解密結(jié)果:
b.在eclipse中用Junit運(yùn)行代碼對(duì)明文加密解密
前提已經(jīng)在配置文件中配置了jasypt相關(guān)信息
jasypt提供了封裝類(lèi)StringEncryptor,可以通過(guò)代碼來(lái)加解密,我們可以使用這個(gè)類(lèi)運(yùn)行相關(guān)方法
Junit相關(guān)代碼:
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("加密結(jié)果:"+name);//解密 @Test public void passDecrypt(){ String username = encryptor.decrypt("7uBC9fVLpL05ipEPzgsDT6Qcjuq9HvDYc0VUIgP4hY="); System.out.println("解密結(jié)果:"+username); } }
運(yùn)行結(jié)果如下:
這個(gè)時(shí)候我們就得到了想要的密文,直接粘貼到配置文件中即可
使用方法如下:
I.在配置文件application.yaml相關(guān)位置把明文替換成密文,用ENC()包裹:
************** 加解密相關(guān)測(cè)試配置信息*************** test: code: username: ENC(pdFVCKrYnVOkTpeJ+081g70kzVWV2aLrTOK2EjrJkkSNMbu4C4IX+Q==)
II.在相應(yīng)的位置直接讀取使用即可,下面我們寫(xiě)一個(gè)controller類(lèi)測(cè)試一下運(yùn)行解密的效果:
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; } }
這個(gè)時(shí)候我們啟動(dòng)項(xiàng)目就能夠看到我們?cè)倥渲弥性O(shè)置的密文對(duì)應(yīng)的明文
至此配置文件的加解密的使用方法就介紹完了
4.補(bǔ)充說(shuō)明
對(duì)于上述配置文件中的ivGeneratorClassname再進(jìn)行一個(gè)詳細(xì)的介紹
對(duì)于上述的Junit中使用的StringEncryptor封裝類(lèi),他是可以通過(guò)讀取配置文件中的信息進(jìn)行加解密相關(guān)參數(shù)進(jìn)行初始化,通過(guò)閱讀遠(yuǎn)嗎,我們可以發(fā)現(xiàn),初始化config的時(shí)候會(huì)跳轉(zhuǎn)到如下的地方進(jìn)行設(shè)置:
如果在配置參數(shù)中沒(méi)有設(shè)置ivGeneratorClassname,那么默認(rèn)就是org.jasypt.salt.NoOpIVGenerator,那么在運(yùn)行加解密的時(shí)候就會(huì)生成一個(gè)24位的密文,如圖:
但是我們可以看到上面用命令行生成的卻比這個(gè)廠(chǎng),這個(gè)時(shí)候如果我們把命令行中生成的密文粘貼到配置文件中則springboot就會(huì)啟動(dòng)不了,Junit也會(huì)報(bào)錯(cuò)解析,把這個(gè)密文用命令解析發(fā)現(xiàn)也會(huì)報(bào)錯(cuò)
這個(gè)說(shuō)明命令行中的加解密不是通過(guò)StringEncryptor類(lèi)來(lái)操作的,那是走那邊的呢?
通過(guò)查閱資料我們發(fā)現(xiàn)了下面的代碼:
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"); // 加密的算法,這個(gè)算法是默認(rèn)的 config.setPassword("12345"); // 加密的密鑰 standardPBEStringEncryptor.setConfig(config); String plainText = "hello"; String encryptedText = standardPBEStringEncryptor.encrypt(plainText); System.out.println(encryptedText); } }
這個(gè)時(shí)候我們運(yùn)行一下,得到下面的結(jié)果:
把這個(gè)密文用命令進(jìn)行解密發(fā)現(xiàn)也是成功的,查看源碼(下圖):可以看出,命令行如果沒(méi)有設(shè)置ivGeneratorClassname那么默認(rèn)就會(huì)new RandomIVGenerator,就是這一步導(dǎo)致了生成了不一樣的密文:
綜上所述,結(jié)合場(chǎng)景,如果我們是項(xiàng)目需要上線(xiàn)了,不方便運(yùn)行Junit去生成密文,填入配置文件,需要用命令行對(duì)明文加密,那一定要在配置文件中設(shè)置ivGeneratorClassname值!?。?/p>
公司電腦沒(méi)有辦法用外網(wǎng)上,圖片用手機(jī)拍的,如果感覺(jué)模糊,請(qǐng)見(jiàn)諒,大家相互學(xué)習(xí)~~~~~~
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。