<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何輕松給Spring Boot配置文件加個密?

          共 4809字,需瀏覽 10分鐘

           ·

          2021-10-02 09:24

          在實踐中,項目的某些配置信息是需要進行加密處理的,以減少敏感信息泄露的風險。比如,在使用Druid時,就可以基于它提供的公私鑰加密方式對數(shù)據(jù)庫的密碼進行加密。

          但更多時候,比如Redis密碼、MQ密碼等敏感信息,也需要進行加密,此時就沒那么方便了。本篇文章給大家介紹一款Java類庫Jasypt,同時基于Spring Boot項目來演示一下如何對配置文件信息進行加密。

          一個簡單的SpringBoot項目

          我們先來創(chuàng)建一個簡單的Spring Boot項目,構建一個加密數(shù)據(jù)運用的場景。

          無論通過Idea或官網等方式,先創(chuàng)建一個Spring Boot項目,核心依賴為:

          <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          <!--    為了方便,通常會引入Lombok依賴    -->
          <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
          </dependency>

          創(chuàng)建一個配置文件類ConfigProperties:

          @Data
          @Component
          public class ConfigProperties {

           @Value("${conf.url}")
           private String url;

           @Value("${conf.password}")
           private String password;

          }

          配置文件中的配置屬性注入到該類,以供后續(xù)使用。

          創(chuàng)建一個Controller類,用來測試驗證,是否能夠正常運行:

          @RestController
          @RequestMapping("/")
          public class ConfigController {

           @Resource
           private ConfigProperties configProperties;

           @RequestMapping
           public void print(){
            System.out.println(configProperties.getUrl());
            System.out.println(configProperties.getPassword());
           }
          }

          對應ConfigProperties類,application.properties中配置如下:

          conf.url=127.0.0.1
          conf.password=admin123

          此時,啟動項目,訪問Controller,能夠正常打印出配置信息,說明程序可以正常運行。

          但配置文件中直接明文展示了password項,如果別人看到該配置文件,就可能導致密碼的泄露。

          基于Jasypt的加密

          針對上述情況,通常,我們會對敏感信息進行加密,避免明文密碼信息暴露,提升安全等級。

          加密的基本思路是:配置文件中存儲加密內容,在解析配置文件注入時進行解密。

          但如果拿到項目源碼,知道加密算法和秘鑰,肯定是可以解密的。這里的加密,只是多一層安全防護,但并不是萬能的。

          下面看看如何基于Jasypt來進行加密處理。

          集成步驟

          下面基于上述Spring Boot項目進行改造升級。

          環(huán)境準備

          不同版本的Jasypt使用方法有所不同,這里基于3.0.4版本、JDK8、Spring Boot 2.5.5來進行演示。

          在使用之前,首先檢查一下JDK8的JRE中是否安裝了不限長度的JCE版本,否則在執(zhí)行加密操作時會拋出解密失敗的異常。

          進入$JAVA_HOME/jre/lib/security目錄,查看是否包含local_policy.jar和US_export_policy.jar兩個jar包。如果不包含,則通過Oracle官網進行下載,下載地址:https://www.oracle.com/java/technologies/javase-jce8-downloads.html。

          下載文件為:jce_policy-8.zip

          文件內包含三個文件:

          README.txt
          local_policy.jar
          US_export_policy.jar

          查看$JAVA_HOME/jre/lib/security目錄下是否有這兩個jar包文件,如果沒有則復制進去,如果有可考慮覆蓋。

          引入依賴

          在Spring Boot中集成Jasypt比較簡單,直接引入如下依賴即可:

          <dependency>
              <groupId>com.github.ulisesbocchio</groupId>
              <artifactId>jasypt-spring-boot-starter</artifactId>
              <version>3.0.4</version>
          </dependency>

          此時,Jasypt組件自動配置便已經生效,只需要對需要加密的數(shù)據(jù)進行處理了。

          為了方便對密碼進行加密,還可以在pom.xml中的build元素中引入對應的plugin,這個后面會用到:

          <plugin>
           <groupId>com.github.ulisesbocchio</groupId>
           <artifactId>jasypt-maven-plugin</artifactId>
           <version>3.0.4</version>
          </plugin>

          至此,所有的準備工作已經完成。

          內容加密

          內容加密有多種方式,這里挑選兩種方式進行介紹。

          方式一:單元測試類生成密文;

          構建如下單元測試類,使用默認實例化的StringEncryptor對密碼進行加密:

          @SpringBootTest
          class SpringBootJasyptApplicationTests {

           @Autowired
           private StringEncryptor stringEncryptor;

           @Test
           void contextLoads() {
            String qwerty1234 = stringEncryptor.encrypt("admin123");
            System.out.println(qwerty1234);
           }
          }

          其中,”admin123“便是要加密的內容。執(zhí)行上述程序,便可打印加密后的內容。這種形式加密的內容,全部采用默認值。

          方式二:通過Maven插件生成密文

          在上面已經引入了Jasypt的Maven插件,可通過對應的命令進行生成密碼。

          第一步:在配置文件中添加加密的密碼:

          jasypt.encryptor.password=afx11

          然后對配置文件中需要加密的數(shù)據(jù)進行改造,在數(shù)據(jù)前添加”DEC(“,在數(shù)據(jù)尾部加上")",修改完如下:

          conf.password=DEC(admin123)

          這里添加的DEC()是告訴插件,此部分內容需要進行加密處理。注意這里關鍵字是DEC。

          第二步:執(zhí)行Maven命令,對上述數(shù)據(jù)進行加密處理

          在命令執(zhí)行以下命令:

          mvn jasypt:encrypt -Djasypt.encryptor.password=afx11

          此時再看配置文件中的conf.password數(shù)據(jù)已經變?yōu)椋?/p>

          jasypt.encryptor.password=afx11
          conf.url=127.0.0.1
          conf.password=ENC(209eBdF3+jsV2f8kDjs4NOCzgBxnVgETlR5q2KfhYo5DW2jqvLknv0TndEkXOXm0)

          注意原來的DEC變成了ENC,原來的明文密碼變成了加密的密文。

          此時,如果想查看明文,執(zhí)行以下命令即可:

          mvn jasypt:decrypt -Djasypt.encryptor.password=afx11

          該命令不會修改配置文件中的密文為明文,只會在控制臺進行明文結果的輸出。

          jasypt.encryptor.password=afx11
          conf.url=127.0.0.1
          conf.password=DEC(admin123)

          經過上述操作,所有改造步驟已經完成,只需啟動系統(tǒng)進行驗證即可。

          密碼的傳遞方式

          完成上述步驟,直接啟動系統(tǒng),訪問對應的請求,會發(fā)現(xiàn)已經能夠成功打印出密碼原文了。

          上述實例中我們將加密的密碼放在了application.properties文件中,這樣并不安全,如果查看代碼就知道如何解密了。通常,還可以采用另外一種形式來傳遞參數(shù):在啟動命令中傳輸密碼。

          比如:

           java -jar jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password

          這樣,密碼便不用存儲在代碼當中了,一定程度上增加了安全性。當然,也可以通過環(huán)境變量來進行傳遞,這樣即便開發(fā)人員也無法獲得生產的密碼。

          小結

          關于Jasypt的使用及與Spring Boot的集成就講這么多,更多內容也可參考官方文檔說明。如果你的項目中還存在很多明文存儲的密碼,真的有必要考慮使用類似的框架進行加密處理了。

          示例源碼地址:https://github.com/secbr/springboot-all/tree/master/springboot-jasypt

          官方源碼地址:https://github.com/ulisesbocchio/jasypt-spring-boot

          往期推薦

          08篇 要給Nacos的UDP通信功能點個贊

          程序員天天寫代碼,如何拓展社交圈?

          05 網絡面經:使用HTTPS就絕對安全了嗎?

          04 網絡面經:HTTP 2.0的這些新特性,是時候了解一下了

          周末,再來聊聊學習、生活與環(huán)境



          如果你覺得這篇文章不錯,那么,下篇通常會更好。添加微信好友,可備注“加群”(微信號:zhuan2quan)

          一篇文章就看透技術本質的人,
            和花一輩子都看不清的人,
            注定是截然不同的搬磚生涯。
          ▲ 按關注”程序新視界“,洞察技術內幕
          瀏覽 121
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草视频日本 | 一区二区三区视频杨思敏 | 依人大香蕉在线视频 | 青青操青青摸 | 日韩免费V |