溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot怎么給配置項加密

發(fā)布時間:2021-07-07 14:45:23 來源:億速云 閱讀:187 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Spring Boot怎么給配置項加密”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring Boot怎么給配置項加密”吧!

Spring Boot內(nèi)置的properties支持為我們讀取properties帶來了便利。Properties文件的屬性主要包含兩種:系統(tǒng)內(nèi)置(包含各個starter)的屬性和用戶自定義的屬性。系統(tǒng)內(nèi)置的屬性由項目啟動之時自動加載,不需要我們編寫相關加載方法,而自定義的屬性需要編寫載入操作。

工作中我們會遇到這樣的需求:為了避免敏感信息暴露,配置文件中有些屬性(比如密碼)必須配置加密后的字符串。系統(tǒng)啟動后自動根據(jù)我們自定義的解密方法解出明文。對于這樣的需求,我們需要如何操作呢?

用戶自定義屬性的自動解密操作

假如我們有自定義屬性:

application.properties

username=paul
password=$%&*(**( #加密過后的字符串

我們可以使用PostConstruct注解,在創(chuàng)建該bean的實例之時自動執(zhí)行解密的方法。如下所示:

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

// 表示在創(chuàng)建該bean之時自動執(zhí)行
@PostConstruct
public void init() {
    // 調用我們自己的解密方法
    password = PasswordUtil.decode(password);
}

系統(tǒng)內(nèi)置屬性的解密處理

比如有如下所示的屬性:

application.properties

spring.datasource.username=rmproject
spring.datasource.password=MTJiN3JtcHJvamVjdA==

Spring數(shù)據(jù)源的密碼是加密過的。但是這個屬性是Spring Boot自己加載的,我們想干預它的加載過程,要比處理自己寫的屬性麻煩多了。

下面為大家介紹一個工具jasypt-spring-boot-starter。它可以做到在Spring Boot加載屬性之前,對屬性進行處理。

該項目GitHub的地址為:https://github.com/ulisesbocchio/jasypt-spring-boot

Jasypt-spring-boot-starter的使用方法

我們引入項目的dependency:

pom.xml

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

首先,我們需要定義一個標記,來告訴工具哪些屬性是需要解密的。比方說,我們在加密的屬性前增加**{cipher}**字樣:

application.properties

spring.datasource.username=rmproject
spring.datasource.password={cipher}MTJiN3JtcHJvamVjdA==

為了支持自定義的加密屬性前綴,需要提供自己實現(xiàn)的EncryptablePropertyDetector類

public class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {

    public static final String ENCODED_PASSWORD_HINT = "{cipher}";

    // 如果屬性的字符開頭為"{cipher}",返回true,表明該屬性是加密過的
    @Override
    public boolean isEncrypted(String s) {
        if (null != s) {
            return s.startsWith(ENCODED_PASSWORD_HINT);
        }
        return false;
    }
    // 該方法告訴工具,如何將自定義前綴去除
    @Override
    public String unwrapEncryptedValue(String s) {
        return s.substring(ENCODED_PASSWORD_HINT.length());
    }
}

有了自定義加密屬性的檢測方法,我們還需要告訴工具如何進行解密操作:

public class MyEncryptablePropertyResolver implements EncryptablePropertyResolver {
    //自定義解密方法
    @Override
    public String resolvePropertyValue(String s) {
        if (null != s && s.startsWith(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT)) {
            return PasswordUtil.decode(s.substring(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT.length()));
        }
        return s;
    }
}

最后,我們需要將他們注冊為bean

@SpringBootApplication
// 入口類添加該注解,開啟屬性自動解密功能
@EnableEncryptableProperties
public class DemoSpringBootApplication {
    //  注冊這兩個bean
    @Bean(name = "encryptablePropertyDetector")
    public EncryptablePropertyDetector encryptablePropertyDetector() {
        return new MyEncryptablePropertyDetector();
    }

    @Bean(name = "encryptablePropertyResolver")
    public EncryptablePropertyResolver encryptablePropertyResolver() {
        return new MyEncryptablePropertyResolver();
    }
}

到此,大功告成,可以啟動項目試試效果了。

到此,相信大家對“Spring Boot怎么給配置項加密”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI