如何加密配置文件里的敏感數(shù)據(jù)
加密配置文件里面的敏感數(shù)據(jù)
項(xiàng)目開(kāi)發(fā)的時(shí)候,需要把數(shù)據(jù)存放到指定的數(shù)據(jù)庫(kù)中(例如MySql、Oracle等),還有會(huì)使用緩存數(shù)據(jù)庫(kù)提升性能的。
連接數(shù)據(jù)庫(kù)相關(guān)的信息一般都是存放在配置文件里面,spring boot會(huì)幫我們注入到具體的對(duì)象里面。但是如果配置文件里面相關(guān)的敏感信息是以【明文】的方式存儲(chǔ),那么就會(huì)存在安全隱患
今天偶然想起是不是可以把敏感信息加密起來(lái),然后寫(xiě)到配置文件里面,結(jié)果一搜,還真的有,特此記錄一下!
通用步驟(引入相關(guān)依賴(lài))
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>數(shù)據(jù)庫(kù)信息

redis緩存信息

修改配置文件,加入密鑰
修改前的yml配置文件
server:
port: 9091
jasypt:
encryptor:
# 指定加密密碼
password: wxzkjtvvgt@44lvvz
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/encryp?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
password: root1234
username: root
application:
name: test-encrypt
redis:
port: 6379
host: 127.0.0.1
password: iamamg
第一種做法
@Test
void testEncrypt() {
final String redisHostEncrypt = stringEncryptor.encrypt("127.0.0.1");
final String redisPasswordEncrypt = stringEncryptor.encrypt("iamamg");
final String mysqlUrl = stringEncryptor.encrypt("jdbc:mysql://127.0.0.1:3306/encryp?serverTimezone=UTC");
final String mysqlUserName = stringEncryptor.encrypt("root");
final String mysqlPassword = stringEncryptor.encrypt("root1234");
System.out.println("==================================");
// 用這些加密的信息替換掉配置文件里面相關(guān)的配置項(xiàng)
System.out.println("redis主機(jī)加密:" + redisHostEncrypt);
System.out.println("redis密碼加密:" + redisPasswordEncrypt);
System.out.println("mysql用戶(hù)名加密:" + mysqlUserName);
System.out.println("mysql密碼加密:" + mysqlPassword);
System.out.println("mysqlUrl加密:" + mysqlUrl);
System.out.println("===================================");
System.out.println("redis主機(jī)解密:" + stringEncryptor.decrypt(redisHostEncrypt));
System.out.println("redis密碼解密:" + stringEncryptor.decrypt(redisPasswordEncrypt));
System.out.println("mysql用戶(hù)名解密:" + stringEncryptor.decrypt(mysqlUserName));
System.out.println("mysql密碼解密:" + stringEncryptor.decrypt(mysqlPassword));
System.out.println("mysqlUrl解密:" + stringEncryptor.decrypt(mysqlUrl));
}
==================================
redis主機(jī)加密:V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw
redis密碼加密:0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY
mysql用戶(hù)名加密:cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF
mysql密碼加密:/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0
mysqlUrl加密:NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb
===================================
redis主機(jī)解密:127.0.0.1
redis密碼解密:iamamg
mysql用戶(hù)名解密:root
mysql密碼解密:root1234
mysqlUrl解密:jdbc:mysql://127.0.0.1:3306/encryp?serverTimezone=UTC
修改后的yml配置文件
可能你也觀察到了,需要額外注意的一點(diǎn)就是,需要加密的數(shù)據(jù)項(xiàng)都使用了ENC()括起來(lái)了
server:
port: 9091
jasypt:
encryptor:
# 加密密碼
password: wxzkjtvvgt@44lvvz
spring:
datasource:
url: ENC(NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb)
driver-class-name: com.mysql.cj.jdbc.Driver
password: ENC(/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0)
username: ENC(cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF)
application:
name: test-encrypt
redis:
port: 6379
host: ENC(V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw)
password: ENC(0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY)
測(cè)試是否可行
/**
* 測(cè)試獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)總量
*/
@Test
void testSelectInMysql() {
String sql = "SELECT COUNT(1) FROM T0001_TEST";
final Integer num = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(num);
}
/**
* 測(cè)試獲取redis中指定key
*/
@Test
void testSelectInRedis() {
final String name = redisTemplate.opsForValue().get("name");
System.out.println(name);
}


但是,大家且思考一下,我們當(dāng)前yml配置文件里面依然存在著密鑰,這是不是很不合理?只要解讀到這個(gè)文件,密鑰還是會(huì)被知道,所以這里提供另外一種做法
第二種做法
1.首先把yml文件里面的密鑰記錄下來(lái),然后把配置去掉(其實(shí)就是把這個(gè)配置移到運(yùn)行的時(shí)候才指定)
啟動(dòng)的時(shí)候加上-Djasypt.encryptor.password= 密鑰 ;這里的密鑰為 wxzkjtvvgt@44lvvz,如果密鑰錯(cuò)誤,項(xiàng)目是啟動(dòng)不成功的,通常報(bào)的錯(cuò)都是數(shù)據(jù)庫(kù)連接失敗,這也挺正常的,因?yàn)槿绻清e(cuò)誤的密鑰,密文信息就無(wú)法解密,得到的自然是不符合的信息,所以會(huì)報(bào)錯(cuò)
# 就把關(guān)于密鑰的部分移除,其他依舊不變
server:
port: 9091
spring:
datasource:
url: ENC(NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb)
driver-class-name: com.mysql.cj.jdbc.Driver
password: ENC(/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0)
username: ENC(cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF)
application:
name: test-encrypt
redis:
port: 6379
host: ENC(V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw)
password: ENC(0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY)
2.在IDEA里面啟動(dòng)程序的方式

3.打成jar包,命令行啟動(dòng)的方式

最終還是測(cè)試是否可行
此時(shí)模擬真實(shí)的三層開(kāi)發(fā)

//controller代碼
/**
* @Author: Amg
* @Date: Created in 17:45 2021/04/17
* @Description: TODO
*/
@RestController
public class TestController {
@Autowired
TestServiceImpl service;
@GetMapping("/count")
public String getCount() {
final Integer count = service.getCount();
if (StringUtils.isEmpty(count)) {
return "連接數(shù)據(jù)庫(kù)出問(wèn)題了";
} else {
return "連接數(shù)據(jù)庫(kù)成功!當(dāng)前數(shù)據(jù)量為:" + count;
}
}
}
//service代碼
/**
* @Author: Amg
* @Date: Created in 17:46 2021/04/17
* @Description: TODO
*/
@Service
public class TestServiceImpl {
@Autowired
private JdbcTemplate jdbcTemplate;
public Integer getCount() {
try {
String sql = "SELECT COUNT(1) FROM T0001_TEST";
return jdbcTemplate.queryForObject(sql, Integer.class);
} catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}
}

莫得問(wèn)題!
總結(jié)
1、引入相關(guān)依賴(lài)
2、修改配置文件,加入密鑰配置 / 啟動(dòng)的時(shí)候指定密鑰
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(58)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08
IDEA自動(dòng)生成類(lèi)圖和時(shí)序圖的操作指南
idea 的強(qiáng)大之處在于此,它包含了很多小插件,我們不需要再次下載相關(guān)插件,只需要在idea中小小的設(shè)置一下就可以了,本文我介紹了IDEA自動(dòng)生成類(lèi)圖和時(shí)序圖的操作指南,我用的是idea2020版本,需要的朋友可以參考下2024-05-05
MyBatis不同Mapper文件引用resultMap實(shí)例代碼
這篇文章主要介紹了mybatis 不同Mapper文件引用resultMap的實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2017-07-07
SpringBoot的application.yml不生效問(wèn)題及解決
這篇文章主要介紹了SpringBoot的application.yml不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
解決maven啟動(dòng)Spring項(xiàng)目報(bào)錯(cuò)的問(wèn)題
下面小編就為大家分享一篇解決maven啟動(dòng)Spring項(xiàng)目報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
WebDriver實(shí)現(xiàn)自動(dòng)化打開(kāi)IE中的google網(wǎng)頁(yè)并實(shí)現(xiàn)搜索
這篇文章主要介紹了WebDriver實(shí)現(xiàn)自動(dòng)化打開(kāi)IE中的google網(wǎng)頁(yè)并實(shí)現(xiàn)搜索,需要的朋友可以參考下2014-04-04
SpringBoot中讀取application.properties配置文件的方法
這篇文章主要介紹了SpringBoot中讀取application.properties配置文件的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02

