日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot使用jasypt加解密密码

發布時間:2025/3/12 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot使用jasypt加解密密码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在我們的服務中不可避免的需要使用到一些秘鑰(數據庫、redis等);使用過SpringBoot配置文件的朋友都知道,資源文件中的內容通常情況下是明文顯示,安全性就比較低一些。打開application.properties或application.yml,比如mysql登陸密碼,redis登陸密碼以及第三方的密鑰等等一覽無余,這里介紹一個加解密組件,提高一些屬性配置的安全性。

開發和測試環境還好,但生產如果采用明文配置講會有安全問題,jasypt是一個通用的加解密庫,我們可以使用它。

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

配置文件:

# 加密的密鑰 # 測試環境可以采用在配置文件中配置 # 生產環境建議采用啟動參數的形式傳入 # 其他配置參數參考:com.ulisesbocchio.jasyptspringboot.properties.JasyptEncryptorConfigurationProperties jasypt.encryptor.password=you salt# 解密得到原始密碼 spring.datasource.password= ENC(密文)

那密文怎么來的呢?

@Autowired StringEncryptor stringEncryptor;@Test public void encrypt() {System.out.println("PWD: " + stringEncryptor.encrypt("yourpassword")); } public static void main(String[] args) {BasicTextEncryptor textEncryptor = new BasicTextEncryptor();//加密所需的salt(鹽)textEncryptor.setPassword("G0CvDz7oJn6");//要加密的數據(數據庫的用戶名或密碼)String username = textEncryptor.encrypt("root");String password = textEncryptor.encrypt("root123");System.out.println("username:"+username);System.out.println("password:"+password);}

jasypt默認使用StringEncryptor來進行加解密,我們也可以自定義自己的加解密類來替換它。

再來詳細介紹一下:

jasypt由一個國外大神寫的一個springboot下的工具包。Git地址:https://github.com/ulisesbocchio/jasypt-spring-boot

直接上代碼:

1、pom文件中增加依賴:

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

2、application.yml文件中增加jasypt的秘鑰(該秘鑰自定義的):

jasypt:encryptor:#加密秘鑰password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7

3、測試類:

@RestController public class IndexController {@Autowiredprivate StringEncryptor encryptor;/*** 測試jasypt加密解密*/@GetMapping("/jasypt")public void testJasypt() {String password = "123456";String encryptPwd = encryptor.encrypt(password);System.out.println("加密::" + encryptPwd);System.out.println("解密:" + encryptor.decrypt(encryptPwd));}}

4、啟動服務,在控制臺可以看到jaspyt的默認配置(比如加密方式是PBEWithMD5AndDES):

5、在瀏覽器請求(端口號自定義):http://localhost:18081/jasypt ,在控制臺打印信息:

加密: stqvirrvG8TcLz9mqflBDQ== 解密:123456

jasypt由于其使用的是PBEWithMD5AndDES加密方式,所以每次加密出來的結果都不一樣,但是解密都是一樣的,所以很適合對數據進行加密

6、將加密的結果替換配置文件中的敏感字段(這里以數據庫密碼為例,數據庫密碼是123456):

spring:application:name: service-providerdatasource: driver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/mydb?autoReconnect=true&failOverReadOnly=false&createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=utf8username: rootpassword: ENC(stqvirrvG8TcLz9mqflBDQ==)

上面的 ENC()是固定寫法,()里面是加密后的信息。

7、在測試類中增加代碼:

@Value("${spring.datasource.password}")private String dbPassword; // 數據庫密碼/*** 測試配置文件字段加密后,項目中該字段的值*/@GetMapping("/password")public String password() {return dbPassword;}

請求http://localhost:18081/password,會發現結果是123456,說明直接將加密文件解密出來了

擴展

a、自定義上面第6點中ENC()的固定寫法。在配置文件中增加jasypt.encryptor.property:

jasypt:encryptor:#加解密秘鑰password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7#設置前綴后綴property:prefix: "ENC@["suffix: "]"

b、將加解密秘鑰放在配置文件中是不安全的,有如下幾種解決辦法:

1、在啟動類上賦值秘鑰:

@SpringBootApplication public class ProviderApplication {public static void main(String[] args) {/** 配置加解密秘鑰,與配置文件的密文分開放 */System.setProperty("jasypt.encryptor.password", "travel-app"); // System.setProperty("jasypt.encryptor.password", "EbfYkitulv73I2p0mXI50JMXoaxZTKJ7");SpringApplication.run(ProviderApplication.class, args);}}

2、自定義StringEncryptor:

/*** 配置StringEncryptor*/@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("EbfYkitulv73I2p0mXI50JMXoaxZTKJ7");config.setAlgorithm("PBEWithMD5AndDES");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.salt.NoOpIVGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}

踩過的坑

a、必須配置加解密用的秘鑰,即jasypt.encryptor.password,不然啟動會報錯

b、springboot2.x以下的版本,只能用jasypt1.x的版本。如果用jasypt2.x的版本,啟動會報錯,詳見https://github.com/ulisesbocchio/jasypt-spring-boot/issues/97

總結

以上是生活随笔為你收集整理的SpringBoot使用jasypt加解密密码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。