SpringBoot項目MySQL配置文件密碼加密(jasypt)

一、穿上衣服停止裸奔

我們在SpringBoot項目中的yml或者properties配置文件中都是明文的,如果mysql數(shù)據(jù)庫賬號、密碼也寫成明文安全性就比較低,明文的密碼就像在裸奔,因此有必要穿上衣服才能愉快地奔跑。我們采用Jasypt框架對MySQL數(shù)據(jù)庫賬號和密碼進(jìn)行加密。

二、使用Jasypt進(jìn)行加密

2.1 添加Jasypt依賴
compile group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '2.1.1'
2.2 將數(shù)據(jù)庫的用戶名和密碼進(jìn)行加密
public class JasyptTest {
    public static void main(String[] args) {
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        //加密所需的salt(鹽),自定義
        textEncryptor.setPassword("retail_salt");
        //要加密的數(shù)據(jù)(數(shù)據(jù)庫的用戶名或密碼)
        String username = textEncryptor.encrypt("retail_u");
        String password = textEncryptor.encrypt("retail_PWD_123");
        System.out.println("username:"+username);
        System.out.println("password:"+password);
    }
}

得到加密字符串

username:5raHicqGiQ1nEXKO+R9ykYwJUrD/+nbx
password:1NiRLG1lUkzLSg3uerUwU0bIRCDYiZnX

注:每次運行得到的加密字符串是不一樣的

2.3 配置application-test.yml文件
spring:
  ########-spring datasource-########
  datasource:
     #賬號配置
     url: jdbc:mysql://127.0.0.1:3306/retail_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
     username: ENC(5raHicqGiQ1nEXKO+R9ykYwJUrD/+nbx)
     password: ENC(1NiRLG1lUkzLSg3uerUwU0bIRCDYiZnX)
     driver-class-name: com.mysql.cj.jdbc.Driver

########-jasypt數(shù)據(jù)庫用戶名、密碼加密salt-########
jasypt:
  encryptor:
    password: retail_salt #加密時的salt值
2.4 完成配置,啟動服務(wù)

到此已經(jīng)完成Jasypt對數(shù)據(jù)庫用戶名、密碼的加密

三、處理salt寫在配置文件里泄露的問題

我們已經(jīng)用Jasypt對數(shù)據(jù)庫用戶名、密碼的加密,但salt值又配置在application-test.yml,知道了salt值反過來又可以對加密字符串進(jìn)行解密, 如:

  BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
  //加密所需的salt(鹽),自定義
  textEncryptor.setPassword("retail_salt");

  //解密
  String decrypt = textEncryptor.decrypt("5raHicqGiQ1nEXKO+R9ykYwJUrD/+nbx");
  System.out.println("username decrypt:"+decrypt);
  // 可解密得到 retail_u

而且網(wǎng)上很多文章卻到此為止,宛如從裸奔“進(jìn)化”到了皇帝的新裝,自欺欺人而已。網(wǎng)上大部分提供的是處理jar的方法,具體可以參考使用Jasypt對SpringBoot配置文件加密
以下我將提供處理war包的方法。

3.1 將jasypt. encryptor. password配置從配置文件中移除

即,將這段配置從application-test.yml移除,隨后jasypt. encryptor. password的值我們將從外部配置文件中讀取

########-jasypt數(shù)據(jù)庫用戶名、密碼加密salt-########
jasypt:
  encryptor:
    password: retail_salt #加密時的salt值
3.2 新建一個名為jasypt.properties的文件,里面內(nèi)容為
jasypt.encryptor.password=retail_salt

并將該文件放在本地/Users/ac/jasypt.properties (我的Mac開發(fā)環(huán)境)


jasypt.properties
3.3 新建一個Java類LocalSettingsEnvironmentPostProcessor
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 AlanChen
 * @description 讀取本地配置文件jasypt加密salt值
 * @date 2019/5/23
 */
public class LocalSettingsEnvironmentPostProcessor implements EnvironmentPostProcessor{
    /**
     * 第一個配置文件路徑為部署環(huán)境路徑,用于部署環(huán)境加載配置文件里的值
     * 第二個配置文件路徑為本地打包環(huán)境路徑,解決打包時報錯問題
     */
    private static final String LOCATIONS [] = {"/opt/tomcat8/webapps/jasypt.properties","/Users/ac/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類的作用就是根據(jù)指定的配置文件路徑,讀取文件,添加到程序運行的環(huán)境中。

3.4 創(chuàng)建一個spring.factories的文件

然后在你的resources文件夾下創(chuàng)建一個文件夾名為META-INF,在里面創(chuàng)建一個spring.factories的文件,文件內(nèi)容如下:

org.springframework.boot.env.EnvironmentPostProcessor=com.netelis.retail.common.config.jasypt.LocalSettingsEnvironmentPostProcessor

這個文件的作用就是設(shè)置SpringBoot服務(wù)啟動的時候調(diào)用我們剛才寫的那個Java類。
至此,你的war包在使用tomcat啟動的時候就應(yīng)該可以讀取制定位置的外部文件了。我的文件結(jié)構(gòu)如下,僅供參考

spring.factories
3.5 打war部署測試
gradle build
image.png
3.5 本地開發(fā),啟動idea

啟動idea也正常


image.png

參考文章:
使用Jasypt對SpringBoot配置文件加密
SpringBoot 打包為war包啟動時導(dǎo)入外部配置文件

最后給大家送波福利

阿里云折扣快速入口

阿里云折扣快速入口
最后編輯于
?著作權(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)容

  • 引入jasypt 生成要加密的字符串 將數(shù)據(jù)庫的用戶名和密碼進(jìn)行加密 輸出信息為: 或者使用Maven下載好的ja...
    風(fēng)靜花猶落閱讀 46,636評論 7 34
  • 上一篇:《Spring Cloud入門教程(七):分布式鏈路跟蹤(Sleuth)》 本人和同事撰寫的《Spring...
    CD826閱讀 16,337評論 6 28
  • 第一章恨意 譽王大婚,新娘逃了。 葉浮生抬腳躍上了城堞,望著城下馬背上喜服加身的男人,神情淡漠,“宋問,我恨你,一...
    情砸閱讀 777評論 0 2
  • 每年五一或者十一這樣的假期,全國各個大小景區(qū),包括去景區(qū)的路上,總是人山人海,人聲鼎沸,熱鬧非常。 每當(dāng)這個時候,...
    xll2068閱讀 304評論 0 0
  • 微微是個單純的有點傻的女孩子,她也不知道喜歡一個人是什么樣的感覺。不過有時候微微也會期待在她懵懂的年紀(jì)有一段童話般...
    阿Y椰子閱讀 692評論 2 2

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