如何加密配置文件里的敏感數(shù)據(jù)
加密配置文件里面的敏感數(shù)據(jù)
項目開發(fā)的時候,需要把數(shù)據(jù)存放到指定的數(shù)據(jù)庫中(例如MySql、Oracle等),還有會使用緩存數(shù)據(jù)庫提升性能的。
連接數(shù)據(jù)庫相關(guān)的信息一般都是存放在配置文件里面,spring boot會幫我們注入到具體的對象里面。但是如果配置文件里面相關(guān)的敏感信息是以【明文】的方式存儲,那么就會存在安全隱患
今天偶然想起是不是可以把敏感信息加密起來,然后寫到配置文件里面,結(jié)果一搜,還真的有,特此記錄一下!
通用步驟(引入相關(guān)依賴)
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
數(shù)據(jù)庫信息
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)的配置項 System.out.println("redis主機加密:" + redisHostEncrypt); System.out.println("redis密碼加密:" + redisPasswordEncrypt); System.out.println("mysql用戶名加密:" + mysqlUserName); System.out.println("mysql密碼加密:" + mysqlPassword); System.out.println("mysqlUrl加密:" + mysqlUrl); System.out.println("==================================="); System.out.println("redis主機解密:" + stringEncryptor.decrypt(redisHostEncrypt)); System.out.println("redis密碼解密:" + stringEncryptor.decrypt(redisPasswordEncrypt)); System.out.println("mysql用戶名解密:" + stringEncryptor.decrypt(mysqlUserName)); System.out.println("mysql密碼解密:" + stringEncryptor.decrypt(mysqlPassword)); System.out.println("mysqlUrl解密:" + stringEncryptor.decrypt(mysqlUrl)); } ================================== redis主機加密:V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw redis密碼加密:0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY mysql用戶名加密:cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF mysql密碼加密:/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0 mysqlUrl加密:NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb =================================== redis主機解密:127.0.0.1 redis密碼解密:iamamg mysql用戶名解密:root mysql密碼解密:root1234 mysqlUrl解密:jdbc:mysql://127.0.0.1:3306/encryp?serverTimezone=UTC
修改后的yml配置文件
可能你也觀察到了,需要額外注意的一點就是,需要加密的數(shù)據(jù)項都使用了ENC()括起來了
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)
測試是否可行
/** * 測試獲取數(shù)據(jù)庫中的數(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); } /** * 測試獲取redis中指定key */ @Test void testSelectInRedis() { final String name = redisTemplate.opsForValue().get("name"); System.out.println(name); }
但是,大家且思考一下,我們當前yml配置文件里面依然存在著密鑰,這是不是很不合理?只要解讀到這個文件,密鑰還是會被知道,所以這里提供另外一種做法
第二種做法
1.首先把yml文件里面的密鑰記錄下來,然后把配置去掉(其實就是把這個配置移到運行的時候才指定)
啟動的時候加上-Djasypt.encryptor.password= 密鑰 ;這里的密鑰為 wxzkjtvvgt@44lvvz,如果密鑰錯誤,項目是啟動不成功的,通常報的錯都是數(shù)據(jù)庫連接失敗,這也挺正常的,因為如果是錯誤的密鑰,密文信息就無法解密,得到的自然是不符合的信息,所以會報錯
# 就把關(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里面啟動程序的方式
3.打成jar包,命令行啟動的方式
最終還是測試是否可行
此時模擬真實的三層開發(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ù)庫出問題了"; } else { return "連接數(shù)據(jù)庫成功!當前數(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; } } }
莫得問題!
總結(jié)
1、引入相關(guān)依賴
2、修改配置文件,加入密鑰配置 / 啟動的時候指定密鑰
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java中l(wèi)ombok的@Data引發(fā)問題詳解
這篇文章主要給大家介紹了關(guān)于java中l(wèi)ombok的@Data引發(fā)問題的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09mybatis配置mapper-locations位置的三種方式小結(jié)
這篇文章主要給大家介紹了關(guān)于mybatis配置mapper-locations位置的三種方式,Mybatis-Plus的初衷是為了簡化開發(fā),而不建議開發(fā)者自己寫SQL語句的,但是有時客戶需求比較復雜,需要的朋友可以參考下2023-08-08springboot啟動前執(zhí)行方法的四種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于springboot啟動前執(zhí)行方法的四種方式,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-01-01