SpringBoot使用Jasypt加密屬性配置


一、前言

一般我們在項目開發中的 yml 或者 properties 配置文件中都是明文的,如果一些敏感信息也使用明文方式配置的話,相對而言安全性就低了很多。

大家都知道配置文件中的都是一些數據庫連接用戶名密碼、一些第三方密鑰等信息。

開發和測試環境還好,但生產環境采用明文配置話將會有安全問題。

所以我們謹慎點,下面我將使用 Jasypt 通用的加解密庫進行加密配置。

二、Jasypt 介紹

Jasypt 是一個優秀的加密庫,支持密碼、Digest認證、文本、對象加密,此外密碼加密復合RFC2307標准。

它提供了單密鑰對稱加密和非對稱加密兩種脫敏方式。

  • 單密鑰對稱加密:一個密鑰加鹽,可以同時用作內容的加密和解密依據;
  • 非對稱加密:使用公鑰和私鑰兩個密鑰,才可以對內容加密和解密;

以上兩種加密方式使用都非常簡單,這里以 SpringBoot 集成單密鑰對稱加密方式做示例。

三、集成 Jasypt

1)引入 maven 依賴

項目中使用 @SpringBootApplication 或 @EnableAutoConfiguration 注解,則直接引入以下依賴。

任何系統屬性,環境屬性,命令行參數,application.properties\yaml 屬性和任何其他自定義屬性源可以包含加密屬性

<!--配置文件加密-->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>

2)yaml 配置

配置 Jasypt

1. 自定義前綴/后綴

前綴后綴主要為了識別該值是否需要解密,如不按照該格式配置,在加載配置項的時候 jasypt 將保持原值,不進行解密

jasypt:
  encryptor:
    property: # 自定義前綴后綴
      prefix: "^Cyan#["     # 前綴,默認 ENC(
      suffix: "]$"          # 后綴,默認 )

不配置時使用默認 ENC(XXX)

2. 配置秘鑰

秘鑰是個安全性要求比較高的屬性,一般不建議直接放在項目內

① 明文配置(不推薦)

jasypt:
  encryptor:
    password: youpassword # 明文配置秘鑰

② 環境變量參數注入

jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPTOR_PASSWORD}
  • 命令行:
    JASYPT_ENCRYPTOR_PASSWORD=youpassword java -jar springboot.jar
  • IDEA:
    image

③ 參數配置 jasypt.encryptor.password

這種方法不需要在 yaml 或者 properties 文件中再配置 jasypt.encryptor.password
將傳遞加密密碼作為命令行參數運行如下:

  • 命令行:
    java -jar -Djasypt.encryptor.password=youpassword springboot.jar
  • IDEA:
    image

3)加密/解密

加密有兩種方式

1. 通過代碼內調用API進行加密/解密

@Autowired
private StringEncryptor stringEncryptor;

public void test() {
    // 原值
    String str = "92664CB0533C7DE2";

    // 加密
    String ciphertext = stringEncryptor.encrypt(str);
    System.out.println("加密值::" + ciphertext); // 加密值::AgQD8VjIbtFP0xXgTYEu+eeC+ldwVqlYisCJBESKSNE=

    // 解密
    String plaintext = stringEncryptor.decrypt(ciphertext);
    System.out.println("解密值::" + plaintext); // 解密值::92664CB0533C7DE2
}

2. 通過命令生成加密值

不使用API可以通過如下命令生成;

java -cp jasypt核心jar jasypt啟動類 input="待加密文本" password=秘鑰 algorithm=使用的加密算法

  • jasypt-1.9.2.jar:jasypt核心jar包,命令行需要進入核心包目錄才能直接調用,否則寫為絕對路徑
  • org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI:jasypt啟動類
  • input="待加密文本"
  • password=秘鑰
  • algorithm=使用的加密算法

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="92664CB0533C7DE2" password=youpassword algorithm=PBEWithMD5AndDES

image

4)測試使用

得到的密文后寫到需要使用到的地方,加密后的字符串需要放到^Cyan#[]$或迷人的ENC()里面,格式如下:

spring:
  application:
    name: jasypt-demo
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver # 數據庫驅動
    name: defaultDataSource                     # 數據源名稱
    url: jdbc:mysql://localhost:3306/all_booking?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    username: ^Cyan#[riLm8px9CZ15Be5muiaKgQ==]$
    password: ^Cyan#[WngRig3JgY9DZ+RchEVUVA==]$

在獲取配置信息時,凡是指定格式如ENC(xxx) 包裹的值全部都會進行解密處理

EncryptablePropertySourceWrapper對Spring屬性管理類PropertySource 做拓展,重寫了getProperty(String name)方法,在獲取配置時,凡是指定格式如ENC(x) 包裹的值全部解密處理。

@SpringBootTest
class JasyptDemoApplicationTests {

    @Autowired
    private DataSource dataSource;

    @Test
    void dataSourceTest() throws SQLException {
        System.err.println("Connection::" + dataSource.getConnection());
        // Connection::HikariProxyConnection@912784040 wrapping com.mysql.cj.jdbc.ConnectionImpl@1756f7cc
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM