如何給yml配置文件的密碼加密(SpringBoot)
最近在忙著解決規(guī)約掃描的問題,其一就是這個(gè)明文密碼必須加密的問題,一般是數(shù)據(jù)庫(kù)的配置。首先我用的是默認(rèn)的PBEWithMD5AndDES默認(rèn)的MD5加密方式,
弄好之后有要求使用AES_256/SM2/SM4等高級(jí)的算法加密,于是后來(lái)又升級(jí)了jar包使用默認(rèn)的PBEWITHHMACSHA512ANDAES_256.
JDK版本-1.8
1.低版本2.x
先記錄低版本的加密方式-----PBEWithMD5AndDES
1)引入jar包
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>如上一個(gè)啟動(dòng)類,在聯(lián)網(wǎng)的情況下就能自動(dòng)下載其余加密需要的jar包。
如果是在內(nèi)網(wǎng)的情況下,可以手動(dòng)在項(xiàng)目的lib目錄引入所需jar包,如下:
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>2.1.0</version>
</dependency>2)生成密碼
@Test
public void testEncrypt() {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
EnvironmentPBEConfig config = new EnvironmentPBEConfig();
config.setAlgorithm("PBEWithMD5AndDES"); // 加密的算法,這個(gè)算法是默認(rèn)的
config.setPassword("Angel"); // 加密的密鑰,隨便自己填寫,很重要千萬(wàn)不要告訴別人
standardPBEStringEncryptor.setConfig(config);
String plainText = "123456"; //自己的密碼
String encryptedText = standardPBEStringEncryptor.encrypt(plainText);
System.out.println(encryptedText);
}如圖,數(shù)據(jù)庫(kù)密碼為123456,密鑰為Angel,加密算法也如上;
運(yùn)行如圖:4o+eS8OaWQ7HcjVgrkoX0A==

3)測(cè)下解密
@Test
public void testDe() {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
EnvironmentPBEConfig config = new EnvironmentPBEConfig();
config.setAlgorithm("PBEWithMD5AndDES");
config.setPassword("Angel");
standardPBEStringEncryptor.setConfig(config);
String encryptedText = "4o+eS8OaWQ7HcjVgrkoX0A=="; //加密后的密碼
String plainText = standardPBEStringEncryptor.decrypt(encryptedText);
System.out.println(plainText);
}運(yùn)行如圖:

4)yml配置
記好加密好的密碼,在yml文件里將數(shù)據(jù)源那里用ENC套上,如下:
spring: datasource: username: root password: ENC(4o+eS8OaWQ7HcjVgrkoX0A==) url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver jasypt: encryptor: password: Angel algorithm: PBEWithMD5AndDES
5)測(cè)測(cè)登錄
題外話,啟動(dòng)類上無(wú)需開啟加密注解(@EnableEncryptableProperties)

2.高版本 3.x
1)引入jar包
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>與前面 一致,沒有外網(wǎng)的條件,引入如下jar包
<!-- https://mvnrepository.com/artifact/org.jasypt/jasypt -->
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>3.0.3</version>
</dependency>2)生成密碼
這里用的是一個(gè)工具類,CV大法。
package com.example.demo.utils;
/**
* @author 楊帥帥
* @time 2021/12/5 - 1:00
*/
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
public class JasypUtil {
private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";
/**
* @Description: Jasyp 加密(PBEWITHHMACSHA512ANDAES_256)
* @Author: Rambo
* @CreateDate: 2020/7/25 14:34
* @UpdateUser: Rambo
* @UpdateDate: 2020/7/25 14:34
* @param plainText 待加密的原文
* @param factor 加密秘鑰
* @return java.lang.String
* @Version: 1.0.0
*/
public static String encryptWithSHA512(String plainText, String factor) {
// 1. 創(chuàng)建加解密工具實(shí)例
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
// 2. 加解密配置
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(factor);
config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
// 為減少配置文件的書寫,以下都是 Jasyp 3.x 版本,配置文件默認(rèn)配置
config.setKeyObtentionIterations( "1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
// 3. 加密
return encryptor.encrypt(plainText);
}
/**
* @Description: Jaspy解密(PBEWITHHMACSHA512ANDAES_256)
* @Author: Rambo
* @CreateDate: 2020/7/25 14:40
* @UpdateUser: Rambo
* @UpdateDate: 2020/7/25 14:40
* @param encryptedText 待解密密文
* @param factor 解密秘鑰
* @return java.lang.String
* @Version: 1.0.0
*/
public static String decryptWithSHA512(String encryptedText, String factor) {
// 1. 創(chuàng)建加解密工具實(shí)例
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
// 2. 加解密配置
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(factor);
config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
// 為減少配置文件的書寫,以下都是 Jasyp 3.x 版本,配置文件默認(rèn)配置
config.setKeyObtentionIterations( "1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
// 3. 解密
return encryptor.decrypt(encryptedText);
}
public static void main(String[] args) {
String factor = "Angel";
String plainText = "123456";
String encryptWithSHA512Str = encryptWithSHA512(plainText, factor);
String decryptWithSHA512Str = decryptWithSHA512(encryptWithSHA512Str, factor);
System.out.println("采用AES256加密前原文密文:" + encryptWithSHA512Str);
System.out.println("采用AES256解密后密文原文:" + decryptWithSHA512Str);
}
}執(zhí)行這個(gè)main方法,來(lái),見證奇跡的時(shí)刻

Exception in thread "main" org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.handleInvalidKeyException(StandardPBEByteEncryptor.java:1207)
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.encrypt(StandardPBEByteEncryptor.java:996)
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:655)
at org.jasypt.encryption.pbe.PooledPBEStringEncryptor.encrypt(PooledPBEStringEncryptor.java:465)
at com.example.demo.utils.JasypUtil.encryptWithSHA512(JasypUtil.java:41)
at com.example.demo.utils.JasypUtil.main(JasypUtil.java:78)
這個(gè)錯(cuò),很有意思,在加密的時(shí)候,手動(dòng)配置了JCE的方法來(lái)支持加密的程序,然而jasypt3.x版本的對(duì)于jdk8自帶的jce的包不兼容,需要升級(jí)一下,所以到網(wǎng)上下載jdk8對(duì)應(yīng)的JCE包jce_policy-8。
下載后解壓有兩個(gè)jar包,如圖:

到該目錄下替換即可:C:\Program Files\Java\jdk1.8.0_25\jre\lib\security

然后運(yùn)行main方法:8jLUdq0Fr7UhJGNwK/Nc6i6/WV4+UBpvtfBLDh4e3jZMJZAhPqfZdGlpFEUk24UZ

成功。
3)yml配置
spring: datasource: username: root password: ENC(8jLUdq0Fr7UhJGNwK/Nc6i6/WV4+UBpvtfBLDh4e3jZMJZAhPqfZdGlpFEUk24UZ) url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver jasypt: encryptor: password: Angel algorithm: PBEWITHHMACSHA512ANDAES_256

改個(gè)登錄密碼:

很順利,不妨再來(lái)驗(yàn)證加密算法,如圖我如果改為
jasypt: encryptor: password: Angel algorithm: PBEWithMD5AndDES
運(yùn)行項(xiàng)目則報(bào)錯(cuò),圖略。
yml文件里面需要配置密鑰以及算法,才能正確解密訪問數(shù)據(jù)庫(kù),那你看這個(gè)Angel密鑰是用password來(lái)修飾的,是否會(huì)被外行的人認(rèn)作密碼呢?
答案是肯定的,所以呀需要使用寫小手段,把密鑰也寫成ENC()這種格式的就OK了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中l(wèi)ogback日志保存到mongoDB的方法
這篇文章主要介紹了SpringBoot中l(wèi)ogback日志保存到mongoDB的方法,2017-11-11
Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-05-05
IDEA2022版本創(chuàng)建maven?web項(xiàng)目的兩種方式詳解
創(chuàng)建maven?web項(xiàng)目有兩種方式,一種是使用骨架方式,一種是不使用骨架的方式,本文結(jié)合實(shí)例代碼給大家介紹了IDEA2022版本創(chuàng)建maven?web項(xiàng)目的兩種方式,需要的朋友可以參考下2023-02-02
springboot動(dòng)態(tài)注入配置與docker設(shè)置環(huán)境變量的方法
這篇文章主要介紹了springboot動(dòng)態(tài)注入配置與docker設(shè)置環(huán)境變量的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Spring學(xué)習(xí)之開發(fā)環(huán)境搭建的詳細(xì)步驟
本篇文章主要介紹了Spring學(xué)習(xí)之開發(fā)環(huán)境搭建的詳細(xì)步驟,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07
Java使用java -jar啟動(dòng)并按日分包日志的最佳實(shí)踐
在生產(chǎn)環(huán)境中,Java應(yīng)用程序通常以java -jar方式運(yùn)行,而日志管理是運(yùn)維的重要部分,如果日志文件過(guò)大,不僅影響性能,還會(huì)增加排查問題的難度,因此,按日分包日志成為常見的需求,本文將介紹4種實(shí)現(xiàn)方式,并提供詳細(xì)配置和代碼示例,需要的朋友可以參考下2025-07-07
用java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09

