SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密
在做數(shù)據(jù)庫敏感信息保護時,Web應(yīng)用配置的賬號密碼,在配置文件應(yīng)加密存儲,禁止使用明文賬號密碼,這時我們可以使用Jasypt加密來實現(xiàn)需求。
一、Jasypt簡介
Jasypt是一個Java簡易加密庫,用于加密配置文件中的敏感信息,如數(shù)據(jù)庫密碼。jasypt庫與springboot集成,在實際開發(fā)中非常方便。
1、Jasypt Spring Boot 為 spring boot 應(yīng)用程序中的屬性源提供加密支持,出于安全考慮,Spring boot 配置文件中的敏感信息通常需要對它進行加密/脫敏處理,盡量不使用明文,要實現(xiàn)這一點,辦法有很多,自己手動對敏感信息進行加解密也是可以的。
2、在程序界有需求就有人奉獻,Jasypt 開源安全框架就是專門用于處理 Spring boot 屬性加密的,在配置文件中使用特定格式直接配置密文,然后應(yīng)用啟動的時候,Jasypt 會自動將密碼解密成明文供程序使用。
1)Jasypt 加密屬性配置格式:
spring: datasource: password: ENC(o6L5p3ymfSMiscyR9CPio4NfGPg+W9==)
ENC() 就是它的標(biāo)識,程序啟動的時候,會自動解密其中的內(nèi)容,如果解密失敗,則會報錯。
2)所以獲取這些屬性值和平時沒有區(qū)別,直接使用如 @Value(“${spring.datasource.password}”) 獲取即可,取值并不需要特殊處理。
3、jasypt 同一個密鑰(secretKey)對同一個內(nèi)容執(zhí)行加密,每次生成的密文都是不一樣的,但是根據(jù)根據(jù)這些密文解密成原內(nèi)容都是可以的.
4、Jasypt 官方使用文檔:http://www.jasypt.org/
GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot。
二、集成方法
官網(wǎng)上推薦的集成到SpringBoot項目中,有3種方法分別是:
- 如果使用@SpringBootApplication或@EnableAutoConfiguration,則僅需要添加jasypt-spring-boot-starter啟動器jar到您的類路徑中即可,它自動會在整個 Spring 環(huán)境中啟用可加密屬性。
- 添加jasypt-spring-boot到您的類路徑并添加@EnableEncryptableProperties到您的主配置類以在整個 Spring 環(huán)境中啟用可加密屬性。
- 添加jasypt-spring-boot到您的類路徑并使用@EncrytablePropertySource注解聲明單獨的可加密屬性源。
2.1 方式一
在Springboot應(yīng)用程序中,如果使用了@SpringBootApplication 或者@EnableAutoConfiguration注解,則可以在pom文件中添加jasypt-spring-boot-starter依賴,然后就可以在整個Spring環(huán)境中使用jasypt對屬性進行加解密操作(屬性包括:系統(tǒng)屬性、環(huán)境屬性、命令行參數(shù)、application.properties、application-*.properties、yml屬性以及任何其他屬性源)。
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <!-- JDK9+用3.x版本,JDK8用2.x版本 --> <!-- 倉庫:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ --> <version>2.1.2</version> </dependency>
2.2 方式二
如果項目中沒有使用到@SpringBootApplication 或者@EnableAutoConfiguration 自動配置注解,則可以通過以下兩個步驟完成對Jasypt的集成。
步驟一:pom文件引入jasypt-spring-boot依賴
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <!-- JDK9+用3.x版本,JDK8用2.x版本 --> <!-- 倉庫:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ --> <version>2.1.2</version> </dependency>
步驟二:在配置類中,添加@EnableEncryptableProperties注解,示例如下:
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.SpringApplication; @SpringBootApplication @EnableEncryptableProperties public class MySpringBootApp { public static void main(String[] args) { SpringApplication.run(MySpringBootApp.class, args); } }
通過這種方式,你的項目一樣可以集成Jasypt,并且可加密屬性也可以在整個Spring環(huán)境中啟用屬性包括:系統(tǒng)屬性、環(huán)境屬性、命令行參數(shù)、application.properties、application-*.properties、yml屬性以及任何其他屬性源)。
2.3 方式三
如果項目中沒有使用到@SpringBootApplication 或者@EnableAutoConfiguration 自動配置注解,又不想在整個Spring環(huán)境中啟用加密的屬性,則可以使用該種方式,具體步驟如下:
步驟一:pom文件引入jasypt-spring-boot依賴
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <!-- JDK9+用3.x版本,JDK8用2.x版本 --> <!-- 倉庫:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ --> <version>2.1.2</version> </dependency>
步驟二、在配置類中,使用@EncryptablePropertySource注解添加任意數(shù)量想要生效加密屬性的配置文件路徑,與Spring中@PropertySource注解的使用類似,示例如下:
@Configuration @EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties") public class MyApplication { ... }
同時,還可以使用@EncryptablePropertySources 注解對@EncryptablePropertySource配置進行分組,示例如下:
@Configuration @EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"), @EncryptablePropertySource("classpath:encrypted2.properties")}) public class MyApplication { ... }
說明:從Jasypt 1.8版本開始,@EncryptablePropertySource注解支持配置YAML文件。
三、Springboot整合Jasypt實戰(zhàn)
3.1 引入依賴
本Demo使用JDK8,所有依賴2.1.2版本
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.4.RELEASE</version> </dependency> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies>
3.2 準(zhǔn)備加密后的數(shù)據(jù)
@Test public void test() { BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); // 加密秘鑰(鹽值) textEncryptor.setPassword("jasyptSalt123"); // 對賬號加密 String encUsername = textEncryptor.encrypt("zhangsan"); System.out.println(encUsername); // 對密碼加密 String encPassword = textEncryptor.encrypt("abc123@test"); System.out.println(encPassword); }
3.3 配置文件使用加密數(shù)據(jù)
spring: datasource: # 明文賬號密碼 username: zhangsan password: abc123@test # 加密后的賬號密碼 encUsername: ENC(CsXfWspTjwzJ99zeeXhNAk7Jk0/XbeTp) encPassword: ENC(SZqTzbJYCOCErUYWDHdSrXC1Mb/wNYSB) # jasypt加密秘鑰,需要從配置文件中刪除,改為在項目啟動命令上配置環(huán)境參數(shù) jasypt: encryptor: password: jasyptSalt123
3.4 直接獲取解密數(shù)據(jù)
@Component @ConfigurationProperties(prefix = "spring.datasource") public class SamProperties { private String username; private String password; // 配置注入前會自動解密 private String encUsername; private String encPassword; }
四、拓展
4.1 關(guān)于加解密秘鑰如何存儲
如果秘鑰寫在代碼或者配置文件,一旦代碼泄露,那別人就可以使用秘鑰解密我們的密文,這樣對敏感信息加密的作用就不存在了,因此,秘鑰不能以明文形式存儲在代碼或者配置文件中,應(yīng)該在應(yīng)用部署時通過變量傳入。
java -Djasypt.encryptor.password=秘鑰 -jar xxx.jar 或: java -jar xxx.jar --jasypt.encryptor.password=秘鑰
4.2 使用jasypt3.0啟動時報
使用jasypt3.0啟動時報:Failed to bind properties under ‘xxx.xxx.xxx’ to java.lang.String
官方描述,3.0后默認(rèn)支持的算法為PBEWITHHMACSHA512ANDAES_256 ,該種加密方式由sha512 加 AES 高級加密組成,需要JDK1.9以上支持或者添加JCE(Java Cryptography Extension無限強度權(quán)限策略文件)支持,否則運行會出現(xiàn)錯誤。
4.2.1 解決方案1,降低版本
降低jasypt的版本 - 使用2.x的版本
4.2.2 解決方案2,修改算法
將加密算法替換成PBEWithMD5AndDES 算法,并配置iv-generator-classname: 為org.jasypt.iv.NoIvGenerator值
到此這篇關(guān)于SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密的文章就介紹到這了,更多相關(guān)SpringBoot Jasypt加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis入門學(xué)習(xí)教程-MyBatis快速入門
MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,這篇文章主要給大家分享MyBatis的一篇快速入門教程2021-06-06java中的Consumer、Supply如何實現(xiàn)多參數(shù)?
Java的Consumer接口只能接受一個參數(shù),但可以通過自定義接口、使用Tuple或嵌套結(jié)構(gòu)來實現(xiàn)對多個參數(shù)的處理,對于Supplier接口,它不能接受參數(shù),但可以通過自定義BiSupplier、結(jié)合Function或封裝參數(shù)為對象來實現(xiàn)對兩個參數(shù)并返回一個值的功能2024-11-11selenium-java實現(xiàn)自動登錄跳轉(zhuǎn)頁面方式
利用Selenium和Java語言可以編寫一個腳本自動刷新網(wǎng)頁,首先,需要確保Google瀏覽器和Chrome-Driver驅(qū)動的版本一致,通過指定網(wǎng)站下載對應(yīng)版本的瀏覽器和驅(qū)動,在Maven項目中添加依賴,編寫腳本實現(xiàn)網(wǎng)頁的自動刷新,此方法適用于需要頻繁刷新網(wǎng)頁的場景,簡化了操作,提高了效率2024-11-11Java Web 實現(xiàn)QQ登錄功能一個帳號同一時間只能一個人登錄
對于一個帳號在同一時間只能一個人登錄,下文給大家介紹的非常詳細(xì),對java web qq 登錄功能感興趣的朋友一起看看吧2016-11-11Java技巧函數(shù)方法實現(xiàn)二維數(shù)組遍歷
這篇文章主要介紹了Java技巧函數(shù)方法實現(xiàn)二維數(shù)組遍歷,二維數(shù)組遍歷,每個元素判斷下是否為偶數(shù),相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-08-08