SpringBoot整合Jasypt實現(xiàn)配置文件和數(shù)據(jù)庫字段敏感數(shù)據(jù)的加解密
1、前言
在我們?nèi)粘i_發(fā)中,很多時候為了保證數(shù)據(jù)的安全,在處理敏感數(shù)據(jù)、前后端數(shù)據(jù)傳輸、數(shù)據(jù)庫敏感數(shù)據(jù)入庫等,數(shù)據(jù)的加密和解密是不可忽視的重要環(huán)節(jié),特別是一些政企項目這點就尤為重要,避免每一次安全審計后反復的調(diào)整,所以在系統(tǒng)設計之初我們就應當把數(shù)據(jù)安全的問題考慮進去!
今天博主就給大家詳細介紹Jasypt-Spring-Boot
的功能,并展示如何在Spring Boot
項目中實現(xiàn)各種加解密操作
2、什么是Jasypt
Jasypt(Java Simplified Encryption)是一個用于加密和解密數(shù)據(jù)的Java庫。它提供了簡單易用的API,可以輕松地將加密功能集成到Java應用程序中。Jasypt支持多種加密算法,并且可以保護各種類型的數(shù)據(jù),包括文本、配置文件和數(shù)據(jù)庫字段等。
3、什么是Jasypt-Spring-Boot
Jasypt-Spring-Boot是一個用于在Spring Boot應用程序中集成Jasypt的Starter。通過使用Jasypt-Spring-Boot,我們可以輕松地在Spring Boot項目中配置和使用Jasypt的加解密功能。
目前該庫已經(jīng)有2.8K
的Star,且目前最新版本是 3.0.5
GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot
4、接入初體驗
在開始接入前首先構建我們的 Spring Boot
項目, 引入相關依賴
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
4.1 yml配置方式
修改 Spring Boot 配置文件,增加密鑰
jasypt: encryptor: password: 123456
在 Spring Boot
啟動類上 或配置類Configuration
類上追加 @EnableEncryptableProperties
注解
具體參數(shù)說明可以查看以下表格
配置項 | 必填 | 默認值 | 說明 |
---|---|---|---|
jasypt.encryptor.password | 是 | 設置密鑰 | |
jasypt.encryptor.algorithm | 否 | PBEWITHHMACSHA512ANDAES_256 | 設置算法 |
jasypt.encryptor.key-obtention-iterations | 否 | 1000 | 設置密鑰生成的迭代次數(shù) |
jasypt.encryptor.pool-size | 否 | 1 | 設置加密池的大小 |
jasypt.encryptor.provider-name | 否 | SunJCE | 設置加密提供者名稱 |
jasypt.encryptor.provider-class-name | 否 | null | 設置加密提供類名 |
jasypt.encryptor.salt-generator-classname | 否 | org.jasypt.salt.RandomSaltGenerator | 設置鹽值生成器的類名 |
jasypt.encryptor.iv-generator-classname | 否 | org.jasypt.iv.RandomIvGenerator | 設置初始化向量生成器的類名 |
jasypt.encryptor.string-output-type | 否 | base64 | 設置輸出字符串的編碼方式 |
jasypt.encryptor.proxy-property-sources | 否 | false | |
jasypt.encryptor.skip-property-sources | 否 | empty list |
最后一個屬性jasypt.encryptor.proxy-property-sources
用于指示jasyp-spring-boot
如何攔截屬性值以進行解密
- 默認值
false
使用PropertySource
、EnumerablePropertySource
和MapPropertySource
的自定義包裝器實現(xiàn)。 - 當為該屬性指定
true
時,攔截機制將在每個特定的PropertySource
實現(xiàn)上使用CGLib
代理。這在某些必須保留原始PropertySource
類型的場景中可能很有用
4.2 自定義配置類方式
創(chuàng)建一個自定義配置類:Bean名稱為: jasyptStringEncryptor
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import org.jasypt.encryption.StringEncryptor; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableEncryptableProperties public class StringEncryptorConfig { @Bean("jasyptStringEncryptor") public StringEncryptor stringEncryptor() { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("password"); config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; } }
溫馨提示
- 在自定義StringEncryptor的時候,會覆蓋默認的加密器,且Bean名稱固定為
jasyptStringEncryptor
- 如果你需要自定義Bean名稱,則需要在springboot配置文件追加
jasypt.encryptor.bean = your encryptorBean Name
如下面自定義自定義Bean名稱
@Bean("encryptorBean") public StringEncryptor stringEncryptor() { //參考上面的配置參數(shù) ... }
4.3 開始測試
我們現(xiàn)在來編寫一個測試類,來體驗加解密的效果
@Resource(name = "jasyptStringEncryptor") private StringEncryptor stringEncryptor; @Test public void testJasypt() { String mysqlRoot = stringEncryptor.encrypt("root"); String mysqlPassword = stringEncryptor.encrypt("123456"); System.out.println("mysqlroot加密后:"+mysqlRoot); System.out.println("mysqlPassword加密后:"+mysqlPassword); System.out.println("==================="); System.out.println("mysqlRoot解密后:"+ stringEncryptor.decrypt(mysqlRoot)); System.out.println("mysqlPassword解密后:"+ stringEncryptor.decrypt(mysqlPassword)); }
測試輸出如下:
4.4 修改mysql參數(shù)加密
我們已經(jīng)獲得了mysql加密后的賬號以及密碼,現(xiàn)在我們來給mysql配置的明文賬戶密碼改一下
加密格式:默認的前后綴是 ENC() 括號里是密文
# 數(shù)據(jù)源配置 spring: #數(shù)據(jù)源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: url: jdbc:mysql://localhost:3306/docker_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # 未加密前 #username: root #password: 123456 # 加密后 username: ENC(TBTl1fiJ7tilJ91sEdym6G8vEQG7Wn3QhIBU77mrfzCtqkHPMEMAihvpjokqUgMP) password: ENC(9galEBTwYzgGG6ER3oY+k45463tkvYSnt+epH8SE/hldbi13hg3+XL7CPKpgJAQp)
啟動SpringBoot項目。觀察控制臺輸出,數(shù)據(jù)庫是否完成連接初始化,且項目啟動成功!
特別說明
小伙伴發(fā)現(xiàn)了在mysql的配置中,我們使用 ENC()
來包裹我們的密文,這個前后綴是可以修改的,如MICRO()
修改配置文件方式
jasypt: encryptor: property: prefix: "MICRO[" suffix: "]"
編碼方式
我們可以通過創(chuàng)建一個名為 encryptablePropertyDetector
類型為 EncryptablePropertyDetector
的Bean來覆蓋默認實現(xiàn),如果你需要修改默認名稱,需要覆蓋屬性 jasypt.encryptor.property.detector-bean
并指定您希望給予bean的名稱
private static class MyEncryptablePropertyDetector implements EncryptablePropertyDetector { @Override public boolean isEncrypted(String value) { if (value != null) { return value.startsWith("MICRO"); } return false; } @Override public String unwrapEncryptedValue(String value) { return value.substring("MICRO".length()); } }
@Bean(name = "encryptablePropertyDetector") public EncryptablePropertyDetector encryptablePropertyDetector() { return new MyEncryptablePropertyDetector(); }
5、使用JVM啟動參數(shù)設置密鑰
在我們 YML
配置方式中, jasypt.encryptor.password=123456
是明文的,有小伙伴會問,哎呀這不也是暴露了加密密鑰么? 要解決這個問題,我們可以使用JVM啟動參數(shù)設置
在IDEA項目里 ,點擊 Edit Configurations
,添加 VM
啟動參數(shù) -Djasypt.encryptor.password=123456
在生產(chǎn)環(huán)境部署jar包的時候,可以使用如下命令啟動:
java -jar your-project.jar --jasypt.encryptor.password=password
6、加密和解密數(shù)據(jù)庫字段
在我們公司某些項目中,用戶的敏感信息是不允許明文存儲數(shù)據(jù)庫的,比如手機號、身份證等,接下來我們來演示如何在實體類中使用Jasypt進行數(shù)據(jù)庫字段實現(xiàn)加解密
注意引入JPA支持 spring-boot-starter-data-jpa
import javax.persistence.AttributeConverter; import javax.persistence.Converter; import org.jasypt.util.text.AES256TextEncryptor; @Component @Converter public class EncryptedStringConverter implements AttributeConverter<String, String> { @Resource(name = "jasyptStringEncryptor") private StringEncryptor stringEncryptor; @Override public String convertToDatabaseColumn(String attribute) { return stringEncryptor.encrypt(attribute); } @Override public String convertToEntityAttribute(String dbData) { return stringEncryptor.decrypt(dbData); } }
然后在實體類中使用這個轉換器
import javax.persistence.Column; import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Convert(converter = EncryptedStringConverter.class) @Column(name = "password") private String password; // Getters and Setters }
7、結語
Jasypt-Spring-Boot
是一個強大且易于使用的工具,可以在Spring Boot
應用程序中實現(xiàn)加密和解密操作。通過本文的介紹,我們了解了如何在Spring Boot
項目中配置和使用Jasypt
,并展示了各種加解密操作的實現(xiàn)方法。
以上就是SpringBoot整合Jasypt實現(xiàn)配置文件和數(shù)據(jù)庫字段敏感數(shù)據(jù)的加解密的詳細內(nèi)容,更多關于SpringBoot Jasypt加解密的資料請關注腳本之家其它相關文章!
相關文章
SSM如何實現(xiàn)在Controller中添加事務管理
這篇文章主要介紹了SSM如何實現(xiàn)在Controller中添加事務管理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Java高并發(fā)場景下的 HttpClient請求優(yōu)化實現(xiàn)
本文主要介紹了Java高并發(fā)場景下的 HttpClient請求優(yōu)化實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-01-01Spring項目中Ordered接口的應用之全局過濾器(GlobalFilter)的順序控制
在Spring框架,尤其是Spring Cloud Gateway或Spring WebFlux項目中,Ordered接口扮演著重要的角色,特別是在實現(xiàn)全局過濾器(GlobalFilter)時,用于控制過濾器執(zhí)行的優(yōu)先級,下面將介紹如何在Spring項目中使用Ordered接口來管理Global Filter的執(zhí)行順序,需要的朋友可以參考下2024-06-06Java在并發(fā)環(huán)境中SimpleDateFormat多種解決方案
這篇文章主要介紹了Java在并發(fā)環(huán)境中SimpleDateFormat多種解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07