日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
SpringBoot保護(hù)敏感配置的四種方法,讓你的系統(tǒng)不再裸奔?。?!

一、問(wèn)題背景

這種敏感信息如果直接放在配置文件中肯定是不安全的,甚至在很多行業(yè)及領(lǐng)域(比如:支付領(lǐng)域)都是不合規(guī)的,所以需要保護(hù) Spring Boot 中的敏感配置信息。

在云岡等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需開(kāi)發(fā)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)營(yíng)銷推廣,外貿(mào)營(yíng)銷網(wǎng)站建設(shè),云岡網(wǎng)站建設(shè)費(fèi)用合理。

所以,你還在讓你的 Spring Boot 系統(tǒng)裸奔嗎?如果是,那不妨看看本文中棧長(zhǎng)分享的 4 種方法,讓你的系統(tǒng)不再裸奔!

二、配置中心(支持自動(dòng)解密)

我覺(jué)得還得看大家的架構(gòu)情況,如果使用了外置的第三方配置中心(支持自動(dòng)解密的那種),就可以把所有的配置信息存儲(chǔ)在配置中心,比如 Spring Cloud 生態(tài)中的配置中心,那么可以使用自帶的加、解密機(jī)制保護(hù)敏感信息:

spring:   
datasource:
username: '{cipher}t1s293294187a31f35dea15e8bafaf7774532xxcc20d6d6dd0dfa5ae753d6836'

需要加密的內(nèi)容以 {cipher} 開(kāi)頭標(biāo)識(shí),并注意要使用單引號(hào)包起來(lái),具體的細(xì)節(jié)可以參考《Spring Cloud 配置中心內(nèi)容加密》這篇文章,Spring Boot 配置文件就只存儲(chǔ)一些無(wú)關(guān)緊要的配置。

大家用的哪款配置中心呢?支付配置加解密嗎?歡迎分享!

如果沒(méi)有用到配置中心呢?

比如說(shuō)傳統(tǒng)的 Spring Boot 的 MVC 項(xiàng)目,所有的代碼、配置都幾乎在同一個(gè)項(xiàng)目中,Spring Boot 中的核心配置文件就是 application.yml(.properties)文件,那要怎么保護(hù)敏感配置信息呢?繼續(xù)往下看!

三、數(shù)據(jù)庫(kù)機(jī)制

可以把所有配置信息存儲(chǔ)到數(shù)據(jù)庫(kù),系統(tǒng)啟動(dòng)的時(shí)候全部加載進(jìn)內(nèi)存。存儲(chǔ)的時(shí)候,敏感信息以對(duì)稱加密算法進(jìn)行加密存儲(chǔ),然后加載的時(shí)候自動(dòng)解密到內(nèi)存。

這是最傳統(tǒng)的配置管理方法,其實(shí)你也可以理解為一個(gè)原始的、簡(jiǎn)易的配置中心,只是功能不那么強(qiáng)大而已,因?yàn)楝F(xiàn)在很多配置中心就是把配置放在數(shù)據(jù)庫(kù)中進(jìn)行存儲(chǔ),然后提供一系列的配置管理功能。

這里的數(shù)據(jù)庫(kù)可以是關(guān)系數(shù)據(jù)庫(kù)(MySQL、Oracle)、內(nèi)存數(shù)據(jù)庫(kù)(Redis、Zookeeper)等,這是普遍用的比較多的中間件技術(shù)。

四、自定義加解密機(jī)制

這時(shí)候也要看使用的程度,如果只是簡(jiǎn)單的數(shù)據(jù)庫(kù)連接池信息,那么可以考慮使用現(xiàn)有系統(tǒng)中的對(duì)稱加密算法,再結(jié)合連接池?cái)?shù)據(jù)源類實(shí)現(xiàn)自定義加解密機(jī)制,比如我們可以模仿 Spring Cloud 加密機(jī)制:

先用系統(tǒng)已有的對(duì)稱加密算法對(duì)數(shù)據(jù)庫(kù)連接信息加密:

spring:   
datasource:
username: '{cipher}t1s293294187a31f35dea15e8bafaf7774532xxcc20d6d6dd0dfa5ae753d6836'

排除 Spring Boot 系統(tǒng)自帶的數(shù)據(jù)源自動(dòng)配置,然后自行組裝數(shù)據(jù)源 Spring Bean。

判斷獲取的配置值是否以 {cipher} 這個(gè)標(biāo)識(shí)開(kāi)頭,如果是,則用系統(tǒng)約定的對(duì)稱加密算法進(jìn)行解密,然后再設(shè)置數(shù)據(jù)源,比如:

// 示例代碼
@Bean
public DataSource dataSource(){
DataSource dataSource = new DruidDataSource();

// 解密
String username = this.getUsername();
if (username.startWith('{cipher}')){
username = Encrypt.decrypt(username, this.getKey()))
}
dataSource.setUsername(username);

...

return dataSource;
}

Spring Boot 基礎(chǔ)就不介紹了,推薦下這個(gè)實(shí)戰(zhàn)教程,教程和示例源碼都已經(jīng)傳了:https://github.com/javastacks/spring-boot-best-practice。

這種使用簡(jiǎn)單,不用額外引入任何第三方包,如果大家也是使用的自定義數(shù)據(jù)源,或者這種手動(dòng)加解密機(jī)制可以滿足保護(hù)其他敏感配置的需求,那么這種方案供大家參考。

上面介紹的自定義的加解密機(jī)制可以滿足一般的需求,如果是 Spring Boot 自動(dòng)配置的場(chǎng)景,比如數(shù)據(jù)源自動(dòng)配置,Redis 自動(dòng)配置,等等,這種在系統(tǒng)啟動(dòng)的時(shí)候就會(huì)默認(rèn)自動(dòng)配置,我們?nèi)斯そ饷芨深A(yù)不到。

像這種情況,我們就需要考慮介入框架層了,在 Spring Boot 框架讀取配置的時(shí)候進(jìn)行攔截解密,或者使用第三方的框架,用的比較多是:Jasypt Spring Boot。

五、Jasypt Spring Boot

Jasypt Spring Boot 是一個(gè)專門為 Spring Boot 項(xiàng)目中的屬性提供加密支持的框架,支持的版本為 Spring Boot 1.x ~ 2.x,棧長(zhǎng)寫(xiě)文之時(shí),現(xiàn)在已經(jīng)有 1.8K+ 的 Star 數(shù)了,還是挺受歡迎的。

開(kāi)源地址:

https://github.com/ulisesbocchio/jasypt-spring-boot

這個(gè)開(kāi)源項(xiàng)目更新也挺及時(shí)的,最新更新的,已支持 Spring Boot 2.5.4!

這里棧長(zhǎng)再免費(fèi)分享你一份 Spring Boot 學(xué)習(xí)筆記,理論和實(shí)戰(zhàn)都非常齊全,助你快速搞定 Spring Boot。

1.Jasypt Spring Boot 實(shí)戰(zhàn)

Jasypt Spring Boot 有 3 種集成方法:

(1)如果開(kāi)啟了 Spring Boot 的自動(dòng)配置(使用了 @SpringBootApplication 或者 @EnableAutoConfiguration 注解):只需要添加 jasypt-spring-boot-starter 依賴即可,這種會(huì)在整個(gè) Spring Environment 中啟用可加密屬性;

(2)添加 jasypt-spring-boot 依賴,同時(shí)在 Spring 主要配置類上添加 @EnableEncryptableProperties 注解,這種會(huì)在整個(gè) Spring Environment 中啟用可加密屬性;

(3)添加 jasypt-spring-boot 依賴,使用 @EncrytablePropertySource 注解聲明各個(gè)可加密的參數(shù)上,這種只適用于獨(dú)立配置參數(shù)加解密;

一般的 Spring Boot 都會(huì)開(kāi)啟自動(dòng)配置,然后再排除個(gè)別的自動(dòng)配置,所以很少會(huì)有全部禁用自動(dòng)配置的情況,不然使用 Spring Boot 的意義不大,這里我們使用第 1 種集成方式進(jìn)行演示。

1.1 引入依賴

核心依賴:


com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.4

Maven 插件(可選):




com.github.ulisesbocchio
jasypt-maven-plugin
${jasypt-spring-boot.version}


1.2 添加密鑰

jasypt:
encryptor:
password: G9w0BAQEFAASCBKYwggSiAgEAAoIBAQC
property:
prefix: "ENC@["
suffix: "]"

這個(gè) jasypt.encryptor.password 參數(shù)是必須的,相當(dāng)于Salt(鹽),以保證密碼安全性,prefix 和 prefix 是自定義的密碼串標(biāo)識(shí),不配置默認(rèn)為:ENC(...)。

1.3 敏感信息加密

/**
* 來(lái)源微信公眾號(hào):Java技術(shù)棧
* 作者:棧長(zhǎng)
*/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class JasyptTest {

@Autowired
private StringEncryptor stringEncryptor;

/**
* 來(lái)源微信公眾號(hào):Java技術(shù)棧
* 作者:棧長(zhǎng)
*/
@Test
public void encrypt() {
String usernameEnc = stringEncryptor.encrypt("javastack");
String passwordEnc = stringEncryptor.encrypt("javastack.cn");

log.info("test username encrypt is {}", usernameEnc);
log.info("test password encrypt is {}", passwordEnc);

log.info("test username is {}", stringEncryptor.decrypt(usernameEnc));
log.info("test password is {}", stringEncryptor.decrypt(passwordEnc));
}
}

這里我注入了一個(gè) StringEncryptor,其類結(jié)構(gòu)圖如下:

如果當(dāng)前沒(méi)有自定義 StringEncryptor,JEncry Sptor Boot 的自動(dòng)配置會(huì)默認(rèn)創(chuàng)建一個(gè) St 實(shí)例,直接用就行了,其構(gòu)造器默認(rèn)值如下:

Key

Required

Default Value

jasypt.encryptor.password

True

-

jasypt.encryptor.algorithm

False

PBEWITHHMACSHA512ANDAES_256

jasypt.encryptor.key-obtention-iterations

False

1000

jasypt.encryptor.pool-size

False

1

jasypt.encryptor.provider-name

False

SunJCE

jasypt.encryptor.provider-class-name

False

null

jasypt.encryptor.salt-generator-classname

False

org.jasypt.salt.RandomSaltGenerator

jasypt.encryptor.iv-generator-classname

False

org.jasypt.iv.RandomIvGenerator

jasypt.encryptor.string-output-type

False

base64

jasypt.encryptor.proxy-property-sources

False

false

jasypt.encryptor.skip-property-sources

False

empty list

然后運(yùn)行測(cè)試用例來(lái)看下測(cè)試結(jié)果:

加解密成功!!

另外,通過(guò) DEBUG 調(diào)試可以看到是一個(gè) DefaultLazyEncryptor 實(shí)例:

當(dāng)然也支持自定義的 Encryptor,有需要的可以自行定制。

如果不想用測(cè)試這種方法生成密文,也可以使用 Maven 插件,這就是前面為什么要加 Maven 插件(可選)的原因,使用方式如下:

mvn jasypt:encrypt-value 
-Djasypt.encryptor.password="G9w0BAQEFAASCBKYwggSiAgEAAoIBAQC"
-Djasypt.plugin.value="javastack"

1.4 敏感信息解密

將上一步生成的密文填充到 application 配置文件中:

javastack:
username: ENC@[K4DsOasic/5Cvu2Y6Ca5dyaw2+eejgqRfhDWB0itMWRONrIN+wLy3xkGbSfYxQ1b]
password: ENC@[UeZWoPt3ZhSs2wPUAKTF21dgnhzimB+FNNiQjpJoPEhwYzI5WH3IWboZ5Wn+5Rgf]

注意 ENC@[] 這個(gè)占位符是上面進(jìn)行自定義配置的。

然后再寫(xiě)一個(gè)程序嘗試打印出來(lái):

/**
* 來(lái)源微信公眾號(hào):Java技術(shù)棧
* 作者:棧長(zhǎng)
*/
@Slf4j
@SpringBootApplication
public class Application {

@Value("${javastack.username}")
private String username;

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

/**
* 來(lái)源微信公眾號(hào):Java技術(shù)棧
* 作者:棧長(zhǎng)
*/
public static void main(String[] args) {
SpringApplication.run(Application.class);
}

/**
* 來(lái)源微信公眾號(hào):Java技術(shù)棧
* 作者:棧長(zhǎng)
*/
@Bean
public CommandLineRunner commandLineRunner() {
return (args) -> {
log.info("javastack.username = {}", username);
log.info("javastack.password = {}", password);
};
}

}

棧長(zhǎng)寫(xiě)了一個(gè) CommandLineRunner,在系統(tǒng)啟動(dòng)之后將密文的原文打印出來(lái),不需要做任何處理,直接注入、打印就行,看是不是明文。

系統(tǒng)啟動(dòng)之后:

結(jié)果正常,自動(dòng)解密成功。

本節(jié)教程所有實(shí)戰(zhàn)源碼已上傳到這個(gè)倉(cāng)庫(kù):

https://github.com/javastacks/spring-boot-best-practice

2.密鑰安全性

我們把 Jasypt 密鑰(password)存放在 application 配置文件中,這樣敏感信息還是在項(xiàng)目代碼中,也不是太安全,建議通過(guò)命令行參數(shù)的方式傳入,如在 IDEA 中這樣設(shè)置:

如果是生產(chǎn)環(huán)境,可以通過(guò)命令的方式傳入:

java -Djasypt.encryptor.password=password -jar xx.jar

甚至還可以配置在服務(wù)器環(huán)境變量中,因?yàn)?StringEncryptor 可以通過(guò) 系統(tǒng)參數(shù)、配置文件、命令行參數(shù)、環(huán)境變量 等等方式進(jìn)行構(gòu)造。

這樣 Spring Boot 中的配置信息就徹底安全了!

Jasypt Spring Boot 功能遠(yuǎn)不止如此,實(shí)際功能要更強(qiáng)大,這里棧長(zhǎng)只是介紹了簡(jiǎn)單的運(yùn)用,更多的自定義的需求大家可以參考官方文檔,那里有更詳細(xì)的教程。

3.Jasypt Spring Boot 原理

Jasypt Spring Boot 它注冊(cè)了一個(gè) Spring 后處理器,它修飾包含在 Spring Environment 中的所有 PropertySource 對(duì)象,并按照 Jasypt 的配置約定對(duì)屬性進(jìn)行加解密。

來(lái)跟一波源碼:

源碼有點(diǎn)復(fù)雜,一路找到了DefaultPropertyResolver 這個(gè)解密器,然后它也是注入了 StringEncryptor 這個(gè)實(shí)例,獲取配置時(shí),會(huì)進(jìn)行解密后再返回。

另外,這個(gè) Resolver 也是支持自定義的,有興趣的可以深入研究下。

總結(jié)

好了,今天棧長(zhǎng)介紹了 Spring Boot 保護(hù)敏感配置信息的 4 種方法,總結(jié)一下:

  • 配置中心(支持自動(dòng)加解密)
  • 自定義加解密機(jī)制
  • 數(shù)據(jù)庫(kù)機(jī)制
  • Jasypt Spring Boot(第三方加解密方案)

總之敏感信息不要放在 Spring Boot 配置文件中,一定要放,就一定要加密,這 4 種方案各有各的應(yīng)用場(chǎng)景,要結(jié)合公司現(xiàn)有的架構(gòu)和系統(tǒng)規(guī)模作出權(quán)衡。

本節(jié)教程所有實(shí)戰(zhàn)源碼已上傳到這個(gè)倉(cāng)庫(kù):https://github.com/javastacks/spring-boot-best-practice。

本文轉(zhuǎn)載自微信公眾號(hào)「Java技術(shù)?!?,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java技術(shù)棧公眾號(hào)。


網(wǎng)頁(yè)名稱:SpringBoot保護(hù)敏感配置的四種方法,讓你的系統(tǒng)不再裸奔!??!
文章來(lái)源:http://www.dlmjj.cn/article/djgcgsj.html