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

SpringBoot集成Jasypt敏感信息加密的操作方法

 更新時(shí)間:2022年05月24日 10:11:05   作者:IT學(xué)習(xí)日記  
這篇文章主要介紹了SpringBoot集成Jasypt加密敏感信息,包括敏感信息加密的作用,項(xiàng)目集成Jasypt方式詳解,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下

前言

在互聯(lián)網(wǎng)遍布社會(huì)各個(gè)角落的時(shí)代,伴隨著的是安全問(wèn)題總是層出不窮。 19年4月,根據(jù)深圳市人民檢察院微信消息,深圳某知名無(wú)人機(jī)企業(yè)的工程師因?yàn)樾孤豆驹创a到開(kāi)源社區(qū)Github上而造成了公司巨大的損失,最終被判處有期徒刑6個(gè)月,罰款20萬(wàn)元。

一般公司的核心業(yè)務(wù)代碼中,都會(huì)存在與數(shù)據(jù)庫(kù)、第三方通信的secret key等敏感信息,如果以明文的方式存儲(chǔ),一旦泄露,那將會(huì)給公司帶來(lái)巨大的損失。 然而,許多中小型公司開(kāi)發(fā)者對(duì)這方面的管理不夠規(guī)范,所以很多敏感信息都是直接以明文形式存放到代碼中,這樣的項(xiàng)目存在的安全風(fēng)險(xiǎn)非常大。

本篇文章通過(guò)講解:Springboot集成Jasypt對(duì)項(xiàng)目敏感信息進(jìn)行加密,提高系統(tǒng)的安全性。

哪些信息需要加密

一個(gè)系統(tǒng)中,一般和數(shù)據(jù)庫(kù)、第三方系統(tǒng)等交互的信息都會(huì)存在相應(yīng)的配置文件中,在配置文件中,所有涉及到信息安全的配置項(xiàng)都不應(yīng)該以明文的形式存儲(chǔ),否則,一旦配置文件泄露,則會(huì)引出巨大的安全問(wèn)題,常見(jiàn)的需要加密的信息項(xiàng)如下:

  • 訪問(wèn)數(shù)據(jù)庫(kù)、緩存等涉及到的賬號(hào)密碼
  • 與第三方系統(tǒng)交互的access key、秘鑰
  • 其他涉及第三方通信的信息

敏感信息加密的作用

第一:是為了防止人為誤操作將代碼泄漏時(shí),第三方能夠簡(jiǎn)單獲取到系統(tǒng)中的敏感信息,從而可能對(duì)系統(tǒng)、數(shù)據(jù)庫(kù)等造成破壞。

其次是一般系統(tǒng)上線都會(huì)有代碼安全檢測(cè)的流程,像賬號(hào)、密碼等敏感數(shù)據(jù)以明文形式存儲(chǔ),一般都是審核不通過(guò)的,因此需要進(jìn)行加密處理。

最后,作為一名開(kāi)發(fā)者,應(yīng)該對(duì)自我有更高的要求,在開(kāi)發(fā)過(guò)程中應(yīng)該要考慮到潛在的風(fēng)險(xiǎn),提供相應(yīng)的處理預(yù)案。

選擇加密的組件

開(kāi)源社區(qū)強(qiáng)大之處在于:有需求就有人奉獻(xiàn)。Jasypt(全稱:Java Simplified Encryption),它是一個(gè)Java類庫(kù),支持開(kāi)發(fā)者無(wú)需深入 了解密碼學(xué)相關(guān)工作原理,花費(fèi)最小的代碼在項(xiàng)目中添加基本的加密功能。

Jasypt官方使用文檔:http://www.jasypt.org/

項(xiàng)目集成Jasypt方式

jasypt-spring-boot組件則是Jasypt提供對(duì)Springboot項(xiàng)目集成的依賴,剛好符合我們的需求,它支持以下3種方式集成到項(xiàng)目中。

方式一

在Springboot應(yīng)用程序中,如果使用了@SpringBootApplication or @EnableAutoConfiguration注解,則可以直接在pom文件中添加jasypt-spring-boot依賴,然后就可以在整個(gè)Spring環(huán)境中使用jasypt對(duì)屬性進(jìn)行加解密操作(屬性包括:系統(tǒng)屬性、環(huán)境屬性、命令行參數(shù)、properties、yml以及任何其他屬性源)。

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

方式二

如果項(xiàng)目中沒(méi)有使用到@SpringBootApplication or @EnableAutoConfiguration注解,則可以通過(guò)以下兩個(gè)步驟完成對(duì)Jasypt的集成。

步驟一:pom文件引入jasypt依賴

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

步驟二:在配置類中,添加@EnableEncryptableProperties注解,示例如下:

@Configuration
@EnableEncryptableProperties
public class MyApplication {
    ...
}

通過(guò)這種方式,你的項(xiàng)目一樣可以集成Jasypt,并且可加密屬性也可以在整個(gè)Spring環(huán)境中啟用(屬性包括:系統(tǒng)屬性、環(huán)境屬性、命令行參數(shù)、properties、yml以及任何其他屬性源)。

方式三

如果項(xiàng)目中沒(méi)有使用到@SpringBootApplication or @EnableAutoConfiguration注解,又不想在整個(gè)Spring環(huán)境中啟用加密的屬性,則可以使用該種方式,具體步驟如下:

步驟一:pom文件引入jasypt依賴

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

步驟二、在配置類中,使用@EncryptablePropertySource注解添加任意數(shù)量想要生效加密屬性的配置文件路徑,與Spring中@PropertySource注解的使用類似,示例如下:

@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {
	...
}

同時(shí),還可以使用@EncryptablePropertySources 注解對(duì)@EncryptablePropertySource配置進(jìn)行分組,示例如下:

@Configuration
@EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),                         @EncryptablePropertySource("classpath:encrypted2.properties")})
	public class MyApplication {
		...
	}

說(shuō)明:從Jasypt 1.8版本開(kāi)始,@EncryptablePropertySource注解支持配置YAML文件

Springboot整合Jasypt實(shí)戰(zhàn)

一、引入依賴

說(shuō)明,本項(xiàng)目使用技術(shù)棧是spring-boot+jasypt,故使用上面介紹的第一種方式來(lái)在項(xiàng)目中集成Jasypt,文章中只截取部分核心代碼,全部代碼會(huì)開(kāi)發(fā)到Github和Gitee上。

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

二、配置文件中添加Jasypt配置信息

1、配置jasypt參數(shù)

jasypt:
  encryptor:
    # 配置加密算法
    algorithm: PBEWithMD5AndDES
    iv-generator-classname: org.jasypt.iv.NoIvGenerator
    property:
      # 算法識(shí)別前綴(當(dāng)算法發(fā)現(xiàn)配置文件中的值以這前綴開(kāi)始,后綴結(jié)尾時(shí),會(huì)使用指定算法解密)
      prefix: IT(
      # 算法識(shí)別后綴
      suffix: )

2、配置加密算法秘鑰 (該秘鑰不能直接放在配置文件中,下面會(huì)具體總結(jié)秘鑰存放的方式,從而保證安全性)

三、使用Jasypt對(duì)數(shù)據(jù)庫(kù)賬號(hào)和密碼加密,并替換明文。

替換后的配置信息:

spring:
  application:
    name: Jasypt-Learning
  datasource:
    url: jdbc:mysql://localhost:3306/user2?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
    username: IT(MIJueAfnYWsKa2kiR8Qrrw==)
    password: IT(qH9m5vjj8RYULOASKdhlOw==)
server:
  port: 9090
# 配置jasypt相關(guān)信息
jasypt:
  encryptor:
    # 配置加密算法
    algorithm: PBEWithMD5AndDES
    iv-generator-classname: org.jasypt.iv.NoIvGenerator
    property:
      # 算法識(shí)別前綴(當(dāng)算法發(fā)現(xiàn)配置文件中的值以這前綴開(kāi)始,后綴結(jié)尾時(shí),會(huì)使用指定算法解密)
      prefix: IT(
      # 算法識(shí)別后綴
      suffix: )

Jasypt加密有3種方式,具體如下:

方式1、使用代碼生成加密串,代碼工具如下:

public static void main(String[] args) {
        String username = encrypt("root");
        String password = encrypt("123456");
        System.out.println(username);
        System.out.println(password);
    }
    /**
     * 加密
     * @param plaintext 明文密碼     * @return
     */
    public static String encrypt(String plaintext) {
        //加密工具
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        //加密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        // 算法類型
        config.setAlgorithm("PBEWithMD5AndDES");
        //生成秘鑰的公鑰
        config.setPassword("PEB123@321BEP");
        //應(yīng)用配置
        encryptor.setConfig(config);
        //加密
        String ciphertext = encryptor.encrypt(plaintext);
        return ciphertext;
    }
    /**
     * 解密
     *
     * @param ciphertext 待解密秘鑰
     * @return
     */
    public static String decrypt(String ciphertext) {
        //加密工具
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        //加密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm("PBEWithMD5AndDES");
        //生成秘鑰的公鑰
        config.setPassword("PEB123@321BEP");
        //應(yīng)用配置
        encryptor.setConfig(config);
        //解密
        String pText = encryptor.decrypt(ciphertext);
        return pText;
    }

方式2、使用java cp命名對(duì)加密生成密文

參數(shù)說(shuō)明:

  • org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI是jasypt提供的一個(gè)用于加密的實(shí)體類
  • org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI是jasypt提供的一個(gè)用于解密的實(shí)體類
  • input表示需要加密的字符串如:密碼
  • password表示本次加密算法使用的秘鑰
  • algorithm表示加密算法的名稱。

特別說(shuō)明: 通過(guò)該種方式獲取密文,需要到maven倉(cāng)庫(kù)下jasypt-1.9.3.jar包所在的路徑下執(zhí)行,否則會(huì)報(bào)找不到對(duì)應(yīng)的主類。

// 加密命令
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input='root' password=abcdef algorithm=PBEWithMD5AndDES

// 解密命令
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input='z4xP29fuY4wF2AJqp1NnoGJxj' password=abcdef algorithm=PBEWithMD5AndDES

方式3、使用jasypt-maven插件生成密文

該插件是jasypt官方提供,在pom中添加對(duì)應(yīng)依賴,然后使用mvn命令即可執(zhí)行加解密操作,具體如下:

// 1、在Pom中添加maven插件依賴
<plugin>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-maven-plugin</artifactId>
	<version>3.0.4</version>
</plugin>

// 2、加密命令
mvn jasypt:encrypt-value -Djasypt.encryptor.password="秘鑰的值" -Djasypt.plugin.value="需要加密的敏感信息"

// 解密命令
mvn jasypt:decrypt-value -Djasypt.encryptor.password="秘鑰的值" -Djasypt.plugin.value="需要解密的密文"

四、查看執(zhí)行結(jié)果

使用中的一些坑

使用過(guò)程中遇到了許多不可預(yù)估的問(wèn)題,特意總結(jié)出來(lái),方便讀者參考。

1、使用jasypt3.0啟動(dòng)時(shí)報(bào):Failed to bind properties under ‘xxx.xxx.xxx’ to java.lang.String

官方描述,3.0后默認(rèn)支持的算法為PBEWITHHMACSHA512ANDAES_256 ,該種加密方式由sha512 加 AES 高級(jí)加密組成,需要JDK1.9以上支持或者添加JCE(Java Cryptography Extension無(wú)限強(qiáng)度權(quán)限策略文件)支持,否則運(yùn)行會(huì)出現(xiàn)錯(cuò)誤。

解決方式:

方式1、將加密算法替換成PBEWithMD5AndDES 算法,并配置iv-generator-classname: 為org.jasypt.iv.NoIvGenerator值

方式2、降低jasypt的版本 - 使用2.x的版本

2、加解密秘鑰如何存儲(chǔ)

如果秘鑰寫(xiě)在代碼或者配置文件,一旦代碼泄露,那別人就可以使用秘鑰解密我們的密文,這樣對(duì)敏感信息加密的作用就不存在了,因此,秘鑰不能以明文形式存儲(chǔ)在代碼或者配置文件中,下面就介紹一些安全的存儲(chǔ)秘鑰的形式。

方式1、把秘鑰當(dāng)做程序啟動(dòng)時(shí)的命令行參數(shù)(推薦),示例如下:

java -jar xxx.jar --jasypt.encryptor.password=秘鑰

方式2、把秘鑰當(dāng)做程序啟動(dòng)時(shí)環(huán)境變量(推薦),示例如下:

java  -Djasypt.encryptor.password=秘鑰 -jar xxx.jar

方式3、自定義加密、解密器邏輯(這個(gè)自定代碼,本文不展開(kāi)講解,后續(xù)有需要重開(kāi)一篇文章詳細(xì)講解)

如何避免Git泄露

因?yàn)殚_(kāi)發(fā)者的疏漏,不小心將源碼提交到開(kāi)源倉(cāng)庫(kù)中的新聞不在少數(shù),作為一個(gè)開(kāi)發(fā)團(tuán)隊(duì),如何采取一些有效的措施去最小程度防止出現(xiàn)這種情況呢? 除了本文介紹的對(duì)敏感信息加密,并合理保存秘鑰外,還有以下的一些方式可以參考。

方式1、更規(guī)范的代碼提交、推送制度、培養(yǎng)開(kāi)發(fā)者的安全意識(shí): 很多時(shí)候,代碼的泄露除了故意為之外,大多數(shù)是因?yàn)椴恍⌒膶?dǎo)致,因此在項(xiàng)目中可以通過(guò)合理管控權(quán)限的方式來(lái)防止代碼泄露。

方式2、合理利用Git忽略文件(.gitignore): 通過(guò)gitignore文件配置匹配規(guī)則,最大程度避免敏感信息上傳到Git倉(cāng)庫(kù)。

方式3、借助第三方工具,在提交、推送時(shí)檢測(cè)代碼是否有敏感數(shù)據(jù): 常見(jiàn)的如git-secrets,在提交前會(huì)對(duì)變更內(nèi)容做檢測(cè),如果檢測(cè)到預(yù)期的提交內(nèi)容可能包含敏感信息,那它們將會(huì)拒絕提交。

方式4、代碼的Code Review: 團(tuán)隊(duì)leader和成員之間可以互相合作,在代碼推送合并時(shí)檢測(cè)是否存在敏感數(shù)據(jù),這樣不僅可以排查出敏感數(shù)據(jù),還能夠?qū)W習(xí)彼此之間的一些編碼技巧。

問(wèn)題探討

在編寫(xiě)本篇文章內(nèi)容時(shí),無(wú)意中看到一個(gè)消息:Nginx之父被俄羅斯警方帶走,起因是因?yàn)槠淅蠔|家 Rambler舉報(bào)Nginx是他在就職期間的業(yè)務(wù)時(shí)間進(jìn)行開(kāi)發(fā)的一個(gè)軟件,Rambler認(rèn)為其應(yīng)該有該軟件代碼的所有權(quán)。

針對(duì)這一事件大家有什么看法呢?程序員在就職期間的業(yè)務(wù)時(shí)間開(kāi)發(fā)或者編寫(xiě)的項(xiàng)目應(yīng)該歸屬于公司?歡迎在文章下留言討論。

寫(xiě)在最后

源代碼安全在技術(shù)企業(yè)中意味著競(jìng)爭(zhēng)力、生命線,一旦泄露,輕則造成項(xiàng)目失敗,重則可能導(dǎo)致公司倒閉,這一關(guān)檢測(cè)的重要性不言而喻,作為一名開(kāi)發(fā)者,也應(yīng)該時(shí)刻培養(yǎng)自己的安全意識(shí),在編碼時(shí)規(guī)避掉相應(yīng)的風(fēng)險(xiǎn)。

到此這篇關(guān)于SpringBoot集成Jasypt加密敏感信息的文章就介紹到這了,更多相關(guān)SpringBoot加密敏感信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解

    Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解

    這篇文章主要介紹了Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java實(shí)現(xiàn)AES加密和解密方式完整示例

    Java實(shí)現(xiàn)AES加密和解密方式完整示例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)AES加密和解密方式的相關(guān)資料,AES加密為最常見(jiàn)的對(duì)稱加密算法,是一種區(qū)塊加密標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用,需要的朋友可以參考下
    2023-10-10
  • Maven將Jar包打入本地倉(cāng)庫(kù)的實(shí)現(xiàn)

    Maven將Jar包打入本地倉(cāng)庫(kù)的實(shí)現(xiàn)

    項(xiàng)目需要用到一個(gè)Jar包,不能從遠(yuǎn)程倉(cāng)庫(kù)拉取,只有一個(gè)Jar包,所以需要將Jar包打入到本地倉(cāng)庫(kù)才能引入項(xiàng)目,本文主要介紹了Maven將Jar包打入本地倉(cāng)庫(kù)的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法

    Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法

    這篇文章主要介紹了Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java使用內(nèi)存數(shù)據(jù)庫(kù)ssdb的步驟

    java使用內(nèi)存數(shù)據(jù)庫(kù)ssdb的步驟

    這篇文章主要介紹了java使用內(nèi)存數(shù)據(jù)庫(kù)ssdb的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼

    SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼

    本文主要介紹了SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼,使用Guava中的Strings、Maps和CharMatcher類來(lái)進(jìn)行日志脫敏,保護(hù)敏感數(shù)據(jù)的安全,感興趣的可以了解一下
    2024-01-01
  • 淺談springboot自動(dòng)裝配原理

    淺談springboot自動(dòng)裝配原理

    作為Spring Boot的精髓,自動(dòng)配置原理首當(dāng)其沖.今天就帶大家了解一下springboot自動(dòng)裝配的原理,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • spring單例如何改多例

    spring單例如何改多例

    這篇文章主要介紹了spring單例如何改多例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java排序去重示例分享

    java排序去重示例分享

    這篇文章主要介紹了java排序去重示例,對(duì)String strs = "ZZZ BBB AAA OOO ZZZ AAA ZZZ"計(jì)算出現(xiàn)個(gè)數(shù),排序去重,需要的朋友可以參考下
    2014-02-02
  • hadoop分布式環(huán)境搭建過(guò)程

    hadoop分布式環(huán)境搭建過(guò)程

    這篇文章主要介紹了hadoop分布式環(huán)境搭建過(guò)程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論