springboot jasypt2.x與jasypt3.x的使用方式
1、前言
如果我們把大量的配置信息都放在配置文件中是會有安全隱患的,那么如何消除這個隱患呢?
最直接的方式就是把配置信息中的一些敏感信息(比如數(shù)據(jù)庫密碼、中間件密碼)加密,然后程序在獲取這些配置的時候解密,就可以達到目的。
這個時候,jasypt框架就派上用場了。
2.x 版本的分析
如果引入的是 2.x 的版本,啟動信息如下:
String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor
Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWithMD5AndDES
Encryptor config not found for property jasypt.encryptor.key-obtention-iterations, using default value: 1000
Encryptor config not found for property jasypt.encryptor.pool-size, using default value: 1
Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null
Encryptor config not found for property jasypt.encryptor.provider-class-name, using default value: null
Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator
Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.NoIvGenerator
Encryptor config not found for property jasypt.encryptor.string-output-type, using default value: base64
通過以上信息的解讀,我們可以了解到的信息如下:
默認加密算法:PBEWithMD5AndDES
默認的迭代次數(shù): 1000
默認池大小: 1
默認生成鹽的類:org.jasypt.salt.RandomSaltGenerator
默認IV生成器類:org.jasypt.iv.NoIvGenerator
默認輸出類型:base64
3.x 版本分析
如果引入的是 3.x 的版本,啟動信息如下:
String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor
Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWITHHMACSHA512ANDAES_256
Encryptor config not found for property jasypt.encryptor.key-obtention-iterations, using default value: 1000
Encryptor config not found for property jasypt.encryptor.pool-size, using default value: 1
Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null
Encryptor config not found for property jasypt.encryptor.provider-class-name, using default value: null
Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator
Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.RandomIvGenerator
Encryptor config not found for property jasypt.encryptor.string-output-type, using default value: base64
通過以上信息的解讀,我們可以了解到的信息如下:
默認加密算法:PBEWITHHMACSHA512ANDAES_256
默認的迭代次數(shù): 1000
默認池大?。?1
默認生成鹽的類:org.jasypt.salt.RandomSaltGenerator
默認IV生成器類:org.jasypt.iv.RandomIvGenerator
默認輸出類型:base64
2、使用
1. 引入pom包
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
2. 創(chuàng)建加密工具類生成密碼
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; /** * Jasyp加解密工具類 * @author chenxc * @date 2020/4/14 14:28 */ public class JasypUtil { private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES"; private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256"; /** * Jasyp2.x 加密(PBEWithMD5AndDES) * @param plainText 待加密的原文 * @param factor 加密秘鑰 * @return java.lang.String */ public static String encryptWithMD5(String plainText, String factor) { // 1. 創(chuàng)建加解密工具實例 StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); // 2. 加解密配置 EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig(); config.setAlgorithm(PBEWITHMD5ANDDES); config.setPassword(factor); encryptor.setConfig(config); // 3. 加密 return encryptor.encrypt(plainText); } /** * Jaspy2.x 解密(PBEWithMD5AndDES) * @param encryptedText 待解密密文 * @param factor 解密秘鑰 * @return java.lang.String */ public static String decryptWithMD5(String encryptedText, String factor) { // 1. 創(chuàng)建加解密工具實例 StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); // 2. 加解密配置 EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig(); config.setAlgorithm(PBEWITHMD5ANDDES); config.setPassword(factor); encryptor.setConfig(config); // 3. 解密 return encryptor.decrypt(encryptedText); } /** * Jasyp3.x 加密(PBEWITHHMACSHA512ANDAES_256) * @param plainText 待加密的原文 * @param factor 加密秘鑰 * @return java.lang.String */ public static String encryptWithSHA512(String plainText, String factor) { // 1. 創(chuàng)建加解密工具實例 PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); // 2. 加解密配置 SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(factor); config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256); // 為減少配置文件的書寫,以下都是 Jasyp 3.x 版本,配置文件默認配置 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); // 3. 加密 return encryptor.encrypt(plainText); } /** * Jaspy3.x 解密(PBEWITHHMACSHA512ANDAES_256) * @param encryptedText 待解密密文 * @param factor 解密秘鑰 * @return java.lang.String */ public static String decryptWithSHA512(String encryptedText, String factor) { // 1. 創(chuàng)建加解密工具實例 PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); // 2. 加解密配置 SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(factor); config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256); // 為減少配置文件的書寫,以下都是 Jasyp 3.x 版本,配置文件默認配置 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); // 3. 解密 return encryptor.decrypt(encryptedText); } public static void main(String[] args) { String factor = "salt"; String plainText = "123456"; String encryptWithMD5Str = encryptWithMD5(plainText, factor); String decryptWithMD5Str = decryptWithMD5(encryptWithMD5Str, factor); String encryptWithSHA512Str = encryptWithSHA512(plainText, factor); String decryptWithSHA512Str = decryptWithSHA512(encryptWithSHA512Str, factor); System.out.println("采用MD5加密前原文密文:" + encryptWithMD5Str); System.out.println("采用MD5解密后密文原文:" + decryptWithMD5Str); System.out.println(); System.out.println("采用SHA512加密前原文密文:" + encryptWithSHA512Str); System.out.println("采用SHA512解密后密文原文:" + decryptWithSHA512Str); } }
也可以調(diào)用jasypt-1.9.2.jar包中一個main方法:org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI
注:jasypt2.x版本可以使用,3.x不能使用
找到maven倉庫中的 jasypt-1.9.2.jar(路徑是:xxx\repository\org\jasypt\jasypt\1.9.2)
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="test" password=salt algorithm=PBEWithMD5AndDES
- -- input參數(shù):你想要加密的密碼
- -- password參數(shù):jasypt用來加密你的密碼的密碼
- -- algorithm加密方式:使用默認就好了
結(jié)果如下圖,途中的output就是加密后的密文了。
3. 修改配置文件,把配置文件中要加密的字段改為:ENC(密文)
yml中添加
system: mysql: url: xxx.xxx.xx.xx username: username password: ENC(EM4fA1YBhd8OTcdl93w2QQ==) jasypt: encryptor: password: salt
那么新的問題又來了,你把密碼鹽放在配置文件中,這些密碼加密就相當于沒加密
5、將加密密鑰作為啟動運行參數(shù)
以上我們的密鑰也是保存在配置文件中的,一旦密鑰泄露,信息被解密,安全隱患依然存在!
因此我們可以通過將密鑰設(shè)置為程序啟動時的參數(shù)來避免?。?!
java -Djasypt.encryptor.password=salt -jar test.jar
idea中如下配置運行:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot結(jié)合redis實現(xiàn)搜索欄熱搜功能及文字過濾
本文主要介紹了springboot結(jié)合redis實現(xiàn)搜索欄熱搜功能及文字過濾,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02IDEA不識別Java文件:文件變橙色&顯示后綴名.java的解決
這篇文章主要介紹了IDEA不識別Java文件:文件變橙色&顯示后綴名.java的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03關(guān)于使用MyBatis簡化JDBC開發(fā)和解決SQL語句警告的問題
這篇文章主要介紹了關(guān)于使用MyBatis簡化JDBC開發(fā)和解決SQL語句警告的問題,如果idea和數(shù)據(jù)庫沒有建立鏈接,idea不識別表的信息,就會出現(xiàn)SQL語句的警告,需要的朋友可以參考下2023-05-05MapStruct內(nèi)部錯誤:NullPointerException的解決方案
在Java開發(fā)中,MapStruct是一個非常流行的對象映射工具,它通過注解處理器在編譯時生成映射代碼,極大地簡化了對象之間的轉(zhuǎn)換操作,本文將詳細分析一個常見的MapStruct內(nèi)部錯誤——NullPointerException,并提供一系列解決方案,需要的朋友可以參考下2025-02-02關(guān)于springboot中對sqlSessionFactoryBean的自定義
這篇文章主要介紹了springboot中對sqlSessionFactoryBean的自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12