欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何加密配置文件里的敏感數(shù)據(jù)

 更新時間:2022年06月17日 09:28:42   作者:碼農(nóng)Amg  
這篇文章主要介紹了加密配置文件里的敏感數(shù)據(jù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

加密配置文件里面的敏感數(shù)據(jù)

項目開發(fā)的時候,需要把數(shù)據(jù)存放到指定的數(shù)據(jù)庫中(例如MySql、Oracle等),還有會使用緩存數(shù)據(jù)庫提升性能的。

連接數(shù)據(jù)庫相關的信息一般都是存放在配置文件里面,spring boot會幫我們注入到具體的對象里面。但是如果配置文件里面相關的敏感信息是以【明文】的方式存儲,那么就會存在安全隱患

今天偶然想起是不是可以把敏感信息加密起來,然后寫到配置文件里面,結(jié)果一搜,還真的有,特此記錄一下!

通用步驟(引入相關依賴)

<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("==================================");
        // 用這些加密的信息替換掉配置文件里面相關的配置項
        
        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ù)庫連接失敗,這也挺正常的,因為如果是錯誤的密鑰,密文信息就無法解密,得到的自然是不符合的信息,所以會報錯

# 就把關于密鑰的部分移除,其他依舊不變
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、引入相關依賴

2、修改配置文件,加入密鑰配置 / 啟動的時候指定密鑰

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 淺談Java8新特性Predicate接口

    淺談Java8新特性Predicate接口

    這篇文章主要介紹了淺談Java8新特性Predicate接口,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java實現(xiàn)二維碼生成的代碼方法

    Java實現(xiàn)二維碼生成的代碼方法

    這篇內(nèi)容分享了JAVA實現(xiàn)二維碼生成的實例代碼,對此有需要的朋友們可以測試參考下。
    2018-07-07
  • java中l(wèi)ombok的@Data引發(fā)問題詳解

    java中l(wèi)ombok的@Data引發(fā)問題詳解

    這篇文章主要給大家介紹了關于java中l(wèi)ombok的@Data引發(fā)問題的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • mybatis配置mapper-locations位置的三種方式小結(jié)

    mybatis配置mapper-locations位置的三種方式小結(jié)

    這篇文章主要給大家介紹了關于mybatis配置mapper-locations位置的三種方式,Mybatis-Plus的初衷是為了簡化開發(fā),而不建議開發(fā)者自己寫SQL語句的,但是有時客戶需求比較復雜,需要的朋友可以參考下
    2023-08-08
  • 淺析SpringBoot自動裝配的實現(xiàn)

    淺析SpringBoot自動裝配的實現(xiàn)

    springboot開箱即用,其實實現(xiàn)了自動裝配,本文重點給大家介紹SpringBoot是如何做到自動裝配的,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • springboot啟動前執(zhí)行方法的四種方式總結(jié)

    springboot啟動前執(zhí)行方法的四種方式總結(jié)

    這篇文章主要給大家介紹了關于springboot啟動前執(zhí)行方法的四種方式,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • java使用swing繪制國際象棋棋盤

    java使用swing繪制國際象棋棋盤

    這篇文章主要為大家詳細介紹了java使用swing繪制國際象棋棋盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 教你java面試時如何聊單例模式

    教你java面試時如何聊單例模式

    這篇文章主要給大家介紹了關于Java單例模式推薦的幾種模式,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2021-06-06
  • 如何基于java實現(xiàn)Gauss消元法過程解析

    如何基于java實現(xiàn)Gauss消元法過程解析

    這篇文章主要介紹了如何基于java實現(xiàn)Gauss消元法過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java實現(xiàn)高效PDF文件傳輸技巧

    Java實現(xiàn)高效PDF文件傳輸技巧

    你是否曾為PDF文件傳輸?shù)牡托识鄲??現(xiàn)在,有了這份Java實現(xiàn)高效PDF文件傳輸技巧指南,你將能夠輕松解決這個問題,我們將分享一些實用的技巧和最佳實踐,幫助你優(yōu)化文件傳輸過程,不要錯過這個提高工作效率的機會,快來閱讀這份指南吧!
    2024-03-03

最新評論