我們在SpringBoot項目中的yml或者properties配置文件中都是明文的,所以使用Jasypt加密。
一、使用Jasypt進行加密
1.添加依賴
<!-- Jasypt加密 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
之前使用1.8的版本的時候,發現項目啓動會報錯,但改用2.1.1的時候就正常啓動了
2、將數據庫的用戶名和密碼進行加密
@Test
void contextLoads() throws SQLException {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
//加密所需的salt(鹽),自定義
textEncryptor.setPassword("test_salt");
//要加密的數據(數據庫的用戶名或密碼)
String password1 = textEncryptor.encrypt("user1234");
String password2 = textEncryptor.encrypt("usert_test");
System.out.println("password1:"+password1);
System.out.println("password2:"+password2);
}
運行後會得到對應的字符串,注:每次運行得到的加密字符串是不一樣的
3、配置application-test.yml文件
spring:
datasource:
orcl:
username: root
password: ENC(v2hSXXiXcKNbzMgRWZ43YH31C0qBOdJt)
jdbc-url: jdbc:oracle:thin:@//localhost:1521/root
driver-class-name: oracle.jdbc.driver.OracleDriver
hisdb:
username: root_test
password: ENC(db7+wPneEQwoIDyKFi/ZxuYpaIv/ajCM)
jdbc-url: jdbc:oracle:thin:@//localhost:1521/root_test
driver-class-name: oracle.jdbc.driver.OracleDriver
########-jasypt數據庫用戶名、密碼加密salt-########
jasypt:
encryptor:
password: test_salt #加密時的salt值
4、啓動項目,即可生效
二、解密
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
//加密所需的salt(鹽),自定義
textEncryptor.setPassword("test_salt");
//解密
String decrypt = textEncryptor.decrypt("v2hSXXiXcKNbzMgRWZ43YH31C0qBOdJt");
System.out.println("password:"+decrypt);
// 可解密得到 user1234
三、外置jasypt.properties配置文件
因爲配置文件yml中明文填寫了密鑰,並且服務器上的war包中yml是可以直接查看到的,如果別人知道密鑰的話,就可以通過密鑰來解密獲得密碼,不夠安全,所以,外面將密鑰單獨配置在項目包外,當war包啓動的時候去讀取就相對的更安全一點。
1、新建一個名爲jasypt.properties的文件
jasypt.encryptor.password=test_salt
自己在服務器中找個位置例如:/home/test/jasypt.properties,本地位置例如:C:/leven/jasypt.properties
2、新建一個Java類LocalSettingsEnvironmentPostProcessor
package com.xxx.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
/**
* @author xxxx
* @description 讀取本地配置文件jasypt加密salt值
* @date 2020/06/19
*/
public class LocalSettingsEnvironmentPostProcessor implements EnvironmentPostProcessor{
/**
* 第一個配置文件路徑爲部署環境路徑,用於部署環境加載配置文件裏的值(Linux服務器)
* 第二個配置文件路徑爲本地打包環境路徑,解決打包時報錯問題(本地路徑)
* 這樣配置的目的就是可以在不更改的情況下直接在本地和服務器上去運行
*/
private static final String LOCATIONS [] = {"/home/test/jasypt.properties","C:\\leven\\jasypt.properties"};
@Override
public void postProcessEnvironment(ConfigurableEnvironment configurableEnvironment, SpringApplication springApplication) {
for(String fileLocation : LOCATIONS){
File file = new File(fileLocation);
if (file.exists()) {
MutablePropertySources propertySources = configurableEnvironment.getPropertySources();
Properties properties = loadProperties(file);
propertySources.addFirst(new PropertiesPropertySource("Config", properties));
return ;
}
}
}
private Properties loadProperties(File f) {
FileSystemResource resource = new FileSystemResource(f);
try {
return PropertiesLoaderUtils.loadProperties(resource);
}
catch (IOException ex) {
throw new IllegalStateException("Failed to load local settings from " + f.getAbsolutePath(), ex);
}
}
}
這個java類的作用就是根據指定的配置文件路徑,讀取文件,添加到程序運行的環境中。
3、創建一個spring.factories的文件
在resources文件夾下創建一個文件夾名爲META-INF,在裏面創建一個spring.factories的文件,文件內容如下:
org.springframework.boot.env.EnvironmentPostProcessor=com.xxx.config.LocalSettingsEnvironmentPostProcessor
注意後面的類的位置不要寫錯了
這個文件的作用就是設置SpringBoot服務啓動的時候調用我們剛纔寫的那個Java類。
至此,你的war包在使用tomcat啓動的時候就應該可以讀取制定位置的外部文件了。
本地啓動和放到服務器上啓動均正常