【SpringBoot3】使用Jasypt加密數據庫用戶名、密碼等敏感信息

一、使用步驟介紹

使用Jasypt(Java Simplified Encryption)進行數據加密和解密主要涉及幾個步驟,包括引入依賴、配置加密密碼、加密敏感信息、將加密信息存儲到配置文件中,以及應用程序啟動時自動解密。以下是詳細的使用說明:

1. 引入依賴

首先,你需要在你的項目中引入Jasypt的依賴。如果你是使用Maven構建項目,可以在pom.xml文件中添加如下依賴(注意版本號可能隨時間更新,請參考最新版本):

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

可根據需要替換成最新的版本號。

2. 配置加密密碼

Jasypt需要一個密碼來進行加密和解密操作。你可以通過以下幾種方式配置這個密碼:

  • 在配置文件中指定:在你的application.propertiesapplication.yml配置文件中,添加jasypt.encryptor.password配置項,并設置你的密碼。例如:

    # application.properties
    jasypt.encryptor.password=your_encryption_password
    

    或者,在application.yml中:

    jasypt:encryptor:password: your_encryption_password
    

    然而,將密碼直接寫在配置文件中可能存在安全風險。因此,更推薦的做法是通過啟動參數或環境變量來傳遞這個密碼。

  • 通過啟動參數指定:在啟動應用程序時,可以通過-Djasypt.encryptor.password=your_encryption_password參數來指定加密密碼。

  • 使用環境變量:在某些情況下,使用環境變量來存儲敏感信息(如加密密碼)可能更為安全。具體方法取決于你的應用程序部署環境。

3. 加密敏感信息

在配置加密密碼后,你可以使用Jasypt提供的工具或API來加密你的敏感信息。加密后的信息將以密文形式存儲。

  • 使用Jasypt CLI工具:Jasypt提供了一個命令行界面(CLI)工具,允許你在命令行中加密和解密字符串。你需要下載Jasypt的jar包,并在命令行中運行相應的命令。

  • 使用Jasypt API:在你的Java應用程序中,你可以通過注入StringEncryptor接口的實現類來編程方式加密和解密字符串。這通常在你的Spring Boot應用程序中通過自動裝配完成。

4. 將加密信息存儲到配置文件中

加密敏感信息后,你需要將這些加密后的信息存儲到配置文件中。在Jasypt中,加密后的信息通常以ENC(...)的形式出現,括號內是加密后的密文。例如:

# application.properties
datasource.password=ENC(加密后的密碼)

5. 應用程序啟動時自動解密

當你的Spring Boot應用程序啟動時,Jasypt會自動檢測配置文件中的ENC(...)字符串,并使用你配置的加密密碼來解密這些字符串。解密后的明文將用于應用程序的配置中。

注意事項

  • 安全性:確保你的加密密碼足夠復雜且安全存儲,避免將密碼直接寫在配置文件中。
  • 版本兼容性:注意你使用的Jasypt版本與其他庫或框架的兼容性。
  • 算法選擇:Jasypt支持多種加密算法,你可以根據需要在配置文件中指定加密算法。

通過以上步驟,你可以在你的Spring Boot應用程序中使用Jasypt來加密和解密配置文件中的敏感信息。

二、使用示例代碼

1、通過工具類生成密文

在application.properties 中增加配置,或者通過-Djasypt.encryptor.password=123456參數來指定加密密碼

# 用于加密的密碼
jasypt.encryptor.password=123456

使用 stringEncryptor.encrypt() 生成密文

public class JasyptSecretTest {@Autowiredprivate StringEncryptor stringEncryptor;@Value("${datasource.password}")private String password;@Testpublic void encrypt(){// 加密String encrypt = stringEncryptor.encrypt("root");System.out.println("encrypt = " + encrypt);}
}

2、在application.properties 中增加配置密文

# 加密后的密文,包裹在ENC() 中
datasource.password=ENC(grdksstYZMsPmwvA0ALHXpzBQN2YTyA3t4ow1PDfJzbl+UV0LdO8UlajWKeqUF7y)
# 用于加密的密碼
jasypt.encryptor.password=123456

3、使用 @Value() 獲取明文,也可以通過stringEncryptor.decrypt(encrypt)手動解密

@SpringBootTest
public class JasyptSecretTest {@Autowiredprivate StringEncryptor stringEncryptor;@Value("${datasource.password}")private String password;@Testpublic void encrypt(){// 加密String encrypt = stringEncryptor.encrypt("root");System.out.println("encrypt = " + encrypt);// 解密,輸入獲取的加密字符串進行解密String decrypt = stringEncryptor.decrypt(encrypt);System.out.println("decrypt = " + decrypt);}@Testpublic void show(){System.out.println("password = " + password);}
}

原理說明

SpringBoot項目在啟動過程中,會自動注入beanStringEncryptor,用于根據不同的加密算法初始化不同的加解密實現類,通過StringEncryptorBuilder.build()初始化不同的加密算法

BeanNamePlaceholderRegistryPostProcessor

@Bean(name = ENCRYPTOR_BEAN_NAME)
public StringEncryptor stringEncryptor(final EnvCopy envCopy,final BeanFactory bf) {final String customEncryptorBeanName = envCopy.get().resolveRequiredPlaceholders(ENCRYPTOR_BEAN_PLACEHOLDER);final boolean isCustom = envCopy.get().containsProperty(ENCRYPTOR_BEAN_PROPERTY);return new DefaultLazyEncryptor(envCopy.get(), customEncryptorBeanName, isCustom, bf);
}

通過EncryptableMapPropertySourceWrapper重寫了getProperty()方法,在獲取配置值的時候,再做解密返回明文

DefaultPropertyResolver

@Override
public String resolvePropertyValue(String value) {return Optional.ofNullable(value).map(environment::resolvePlaceholders).filter(detector::isEncrypted).map(resolvedValue -> {try {// 獲取密文String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);// 執行解密操作return encryptor.decrypt(resolvedProperty);} catch (EncryptionOperationNotPossibleException e) {throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed,  make sure encryption/decryption " +"passwords match", e);}}).orElse(value);
}

三、Jasypt配置項

Jasypt支持多種配置參數以進行密碼、Digest認證、文本和對象的加密。以下是Jasypt支持的一些常見配置參數:

配置參數描述示例
jasypt.encryptor.password加密器的密碼,用于解密屬性jasypt.encryptor.password=mySecretPassword
jasypt.encryptor.algorithm加密算法的名稱jasypt.encryptor.algorithm=PBEWithMD5AndDES
jasypt.encryptor.keyObtentionIterations獲取密鑰時使用的迭代次數jasypt.encryptor.keyObtentionIterations=1000
jasypt.encryptor.poolSize加密池的大小(如果使用了池化加密器)jasypt.encryptor.poolSize=1
jasypt.encryptor.providerName加密提供者的名稱(如JCE提供者)jasypt.encryptor.providerName=SunJCE
jasypt.encryptor.saltGeneratorClassName鹽生成器的類名jasypt.encryptor.saltGeneratorClassName=org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.ivGeneratorClassName初始化向量生成器的類名jasypt.encryptor.ivGeneratorClassName=org.jasypt.iv.NoIvGenerator
jasypt.encryptor.stringOutputType加密字符串的輸出類型(如base64)jasypt.encryptor.stringOutputType=base64
jasypt.encryptor.property.prefix加密屬性前綴,用于識別加密屬性jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix加密屬性后綴,用于識別加密屬性jasypt.encryptor.property.suffix=)
jasypt.encryptor.proxyPropertySources是否通過代理截取屬性值以進行解密jasypt.encryptor.proxyPropertySources=true

注意:

  • 這些參數主要用于配置Jasypt加密器(StringEncryptor)的行為。
  • 在實際使用中,特別是生產環境中,jasypt.encryptor.password等敏感信息不應該硬編碼在配置文件中,而是通過環境變量、命令行參數或外部配置文件等方式安全地傳遞。
  • Jasypt支持多種加密算法,如PBEWithMD5AndDES、PBEWithHMACSHA512ANDAES_256等,具體選擇哪種算法取決于安全需求和環境配置。
  • 上述表格中的示例配置參數值僅為演示用途,實際使用時需要根據項目需求和安全策略進行配置。

四、支持的加密算法

Jasypt支持多種加密算法以保護敏感數據。以下是Jasypt支持的一些常見加密算法:

加密算法名稱描述
PBEWithMD5AndDES基于密碼的加密(PBE),使用MD5作為散列函數和DES作為加密算法。這是一種較舊的加密算法,但在某些舊系統中可能仍在使用
PBEWithMD5AndTripleDES與PBEWithMD5AndDES類似,但使用TripleDES作為加密算法,提供了更強的安全性。
PBEWithHMACSHA512ANDAES_256使用HMAC-SHA-512散列函數和AES-256加密算法的組合,提供了非常高的安全性。這是Jasypt較新版本中推薦的加密算法之一(默認值)
AES高級加密標準(AES),是一種廣泛使用的對稱加密算法。Jasypt支持不同長度的AES密鑰,如AES-128、AES-192和AES-256
RSARivest-Shamir-Adleman(RSA)算法,是一種非對稱加密算法。它使用一對密鑰:公鑰和私鑰。公鑰用于加密數據,私鑰用于解密數據

參考資料

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40308.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

11 docker安裝redis

目錄 安裝redis 1. 配置redis配置文件redis.conf 1.1. 找到redis.conf文件 1.2. 配置文件 2. 啟動容器 3. 測試redis-cli連接 4. 證明docker使用的是指定的配置文件 安裝redis 1. 配置redis配置文件redis.conf 1.1. 找到redis.conf文件 宿主機創建目錄/app/redis在/a…

WebXR:Web上的虛擬與增強現實技術

WebXR 是一種允許在網頁上創建虛擬現實 (VR) 和增強現實 (AR) 體驗的技術標準&#xff0c;它結合了WebVR和WebAR的概念&#xff0c;為開發者提供了一個統一的平臺來開發跨平臺的沉浸式Web應用。 WebXR 概述 什么是WebXR&#xff1f; WebXR API 旨在讓瀏覽器成為VR和AR內容的平…

雙非怎么進大廠?

https://www.nowcoder.com/share/jump/2764630231719583704126 大家好&#xff0c;我是白露啊。 今天我們要分享一個非常勵志的故事&#xff0c;它證明了雙非背景的畢業生也可以通過努力和堅持&#xff0c;進入夢想中的大廠。 下面是這位網友的真實經歷&#xff0c;希望能為正…

泰安再見,泰山OFFICE還會再見

路過泰安&#xff0c;遇見彩虹。懷念和感恩在泰山信息科技的萬丈豪情。 泰山OFFICE&#xff0c;還是要復活。

JavaScript Set新增7個方法操作集合

intersection() intersection () 它返回一個包含此集合和給定集合中所有元素的新集合。 const odds new Set([1, 3, 5, 7, 9]);const squares new Set([1, 4, 9]);console.log(odds.intersection(squares)); // Set(2) { 1, 9 }union() union () 它返回一個包含此集合中所有元…

提升Android Studio開發體驗:使用Kelp插件實現顏色和圖標預覽

提升Android Studio開發體驗&#xff1a;使用Kelp插件實現顏色和圖標預覽 在Android開發中&#xff0c;自動補全功能對于提高開發效率至關重要。然而&#xff0c;默認的Android Studio并不能預覽顏色和圖標&#xff0c;這使得開發者在選擇資源時常常感到困惑。本文將介紹如何使…

【C語言小知識】備選拼寫:iso646.h頭文件

備選拼寫&#xff1a;iso646.h頭文件 C語言中有3種邏輯運算符&#xff1a; 邏輯運算符含義&&與||或!非 假設exp1和exp2是倆個簡單的關系表達式&#xff0c;那么 當且僅當exp1和exp2都為真時&#xff0c;exp1 && exp2才為真。如果exp1或exp2為真&#xff0c;…

【學習筆記】Fréchet距離的 C 語言實現

Frchet 距離 Frchet 距離&#xff0c;又稱為弗雷歇距離&#xff0c;是一種衡量兩條曲線&#xff08;或兩個路徑&#xff09;之間相似性的度量方法。這個概念最初在度量空間理論中被定義&#xff0c;后來被廣泛應用于計算機科學、地理信息系統、圖像處理、生物信息學等多個領域…

使用Python實現深度學習模型:遷移學習與領域自適應教程

引言 遷移學習和領域自適應是深度學習中的兩個重要概念。遷移學習旨在將已在某個任務上訓練好的模型應用于新的任務&#xff0c;而領域自適應則是調整模型以適應不同的數據分布。本文將通過一個詳細的教程&#xff0c;介紹如何使用Python實現遷移學習和領域自適應。 環境準備…

Visual Studio常見問題

VS的文件路徑為什么要用雙斜杠(\)? 答:在編程時,寫入文件的路徑如image = cvLoadImage("C:\Users\lyb\Documents),這種寫法在編譯時不會報錯,但在運行時會報錯,報錯圖像讀入為空,這是因為Windows的路徑雖然用的是單斜杠,但在編程時的意義是不同的,單斜杠“\”…

Go語言中的可變參數:靈活而強大的函數參數

Go語言中的可變參數:靈活而強大的函數參數 在Go語言中,可變參數是一種非常有用的特性,它允許函數接受任意數量的參數。這種靈活性使得函數可以更加通用和可復用。本文將深入探討Go語言中可變參數的用法、原理和最佳實踐。 什么是可變參數? 可變參數允許你傳遞零個或多個值給…

LNMP架構搭建Discuz論壇

LNMP架構是一種用于搭建Web服務器環境的常用架構&#xff0c;由Linux、Nginx、MySQL和PHP組成 組成功能Linux作為操作系統的基礎&#xff0c;提供穩定的環境Nginx作為反向代理服務器&#xff0c;處理客戶端的請求并將他們轉發給后端的應用服務器MySQL作為關系型數據庫管理系統…

7.2 數據結構

作業 #include <stdio.h> #include <string.h> #include <stdlib.h> struct student {char name[32];int age;double score; }s[3];void stu_input(struct student *s,int n) {printf("請輸入%d個學生的信息&#xff08;姓名&#xff0c;年齡&#xff0…

【服裝識別系統】圖像識別+Python+人工智能+深度學習+算法模型+TensorFlow

一、介紹 服裝識別系統&#xff0c;本系統作為圖像識別方面的一個典型應用&#xff0c;使用Python作為主要編程語言&#xff0c;并通過TensorFlow搭建ResNet50卷積神經算法網絡模型&#xff0c;通過對18種不同的服裝&#xff08;‘黑色連衣裙’, ‘黑色襯衫’, ‘黑色鞋子’, …

Python機器學習實戰:利用決策樹算法預測鳶尾花種類

引言 在人工智能領域&#xff0c;機器學習作為一種強大的工具正在改變我們對數據的認知和處理方式。Python因其豐富的機器學習庫和直觀易用的特性&#xff0c;成為了眾多開發者首選的語言。本篇文章將帶領大家深入了解如何運用Python中的scikit-learn庫來構建決策樹模型&#…

關系型數據庫和矢量數據庫分別適用于哪些領域?

關系型數據庫和矢量數據庫分別適用于哪些領域&#xff1f; 李升偉 關系型數據庫適用于以下領域&#xff1a; 1. 金融行業&#xff1a;如銀行的交易處理、賬戶管理等&#xff0c;對數據的一致性和事務處理要求極高。 2. 企業資源規劃&#xff08;ERP&#xff09;&#xff1a…

Meta 發布 Meta 3D Gen 文本生成3D模型

Meta推出了 Meta 3D Gen &#xff08;3DGen&#xff09;&#xff0c;這是一種用于文本到 3D 資產生成的最先進的快速管道。3DGen 可在一分鐘內提供具有高提示保真度和高質量 3D 形狀和紋理的 3D 資產創建。 它支持基于物理的渲染 &#xff08;PBR&#xff09;&#xff0c;這是…

網口串口(Serialport)服務器

文章所用工具http://t.csdnimg.cn/2gIR8http://t.csdnimg.cn/2gIR8 搭建服務器界面 操作配置文件保存方式類 public string FileName { get; set; }public IniHelper(string name) {this.FileName name; //在構造函數中給路徑賦值} 1 先導入c語言進行讀取操作ini文件的方法 …

Python基于you-get下載網頁上的視頻

? 1.python 下載地址 下載 : https://www.python.org/downloads/ 2. 配置環境變量 配置 python_home 地址 配置 python_scripts 地址 在path 中加入對應配置 3. 驗證 ? C:\Users>python --version Python 3.12.4C:\Users>wheel version wheel 0.43.04. 下載 c…