Springboot實現(xiàn)ENC加密的詳細流程
1. 為什么要用ENC加密
以下是未經(jīng)過加密的數(shù)據(jù)庫配置,密碼均是采用明文密碼,很容易導致數(shù)據(jù)庫泄露。
spring: datasource: dynamic: postgresql: url: jdbc:postgresql://127.0.0.1:5589/mypg?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai username: root password: admin driver-class-name: org.postgresql.Driver ... redis: ip: www.xxxx.top port: 6379 # 密碼 pass: admin # 最大實例 max-total: 1024 # 最大空閑實例 max-idle: 100 # 等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。 max-wait: 10000 # 超時時間,單位毫秒。 timeout: 10000
以下是經(jīng)過ENC加密之后的配置,這樣之后,數(shù)據(jù)庫密碼安全級別就高了。
spring: datasource: dynamic: postgresql: url: jdbc:postgresql://127.0.0.1:5589/mypg?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai username: root password: ENC(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q) driver-class-name: org.postgresql.Driver ... redis: ip: www.xxxx.top port: 6379 # 密碼 pass: ENC(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q) # 最大實例 max-total: 1024 # 最大空閑實例 max-idle: 100 # 等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。 max-wait: 10000 # 超時時間,單位毫秒。 timeout: 10000
2. jasypt實現(xiàn)ENC加密
1. 實現(xiàn)流程
導入依賴:
<!-- 配置文件加密 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>測試類:
import org.jasypt.encryption.StringEncryptor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* @Author: chenJY
* @Description:
* @Date: 2022-11-18 9:19
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class EncryptorTest {
@Resource
private StringEncryptor jasyptStringEncryptor;
@Test
public void encode() {
System.out.println( "加密密文:" + jasyptStringEncryptor.encrypt("admin") );
System.out.println("解密密文:" + jasyptStringEncryptor.decrypt(jasyptStringEncryptor.encrypt("admin")));
}
}
運行測試類:

注意: 每次運行測試類輸出的加密密碼都不同,但不影響其解密密文。
將加密密文加入到配置文件中:
spring: datasource: dynamic: postgresql: url: jdbc:postgresql://127.0.0.1:5589/mypg?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai username: root password: ENC(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q) driver-class-name: org.postgresql.Driver ... redis: ip: www.xxxx.top port: 6379 # 密碼 pass: ENC(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q) # 最大實例 max-total: 1024 # 最大空閑實例 max-idle: 100 # 等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。 max-wait: 10000 # 超時時間,單位毫秒。 timeout: 10000
重啟springboot項目,能正常啟動
2. 說明
由于springboot自動配置的特性,導入 jasypt-spring-boot 依賴包之后,不用進行過多配置,就能實現(xiàn)配置文件加密字段自動解密,所以特別方便。
1. 自定義加密秘鑰
1. 鹽、前綴、后綴
可以在配置文件中自定義一個加密秘鑰(鹽), 來獲取明文密碼。
# 加密秘鑰
jasypt:
encryptor:
password: Chen # 加密時的salt值
自定義加密前綴、后綴: 如果不想使用 ENC來作為加密前綴,那么可以通過配置文件修改:
# 加密秘鑰
jasypt:
encryptor:
password: Chen
property:
prefix: Chen( # 前綴
suffix: )chen # 后綴那么,密碼的格式如下:
password: Chen(2qWZr4WLw8H0nPBzMXBV9WimRfKC3pv5UVGB5mMApbINg2s83VfsYvL7XTWaUR8q)chen
2. 自定義加密方案
配置類
@Configuration
public class MyEncryptorCfg {
/**
* @Description 自定義的加密器配置
* @author chenJY
* @date 2022/11/18 9:52
* @return StringEncryptor
*/
@Bean(name = "myStringEncryptor")
public StringEncryptor myStringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("Chen");
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;
}
}注意1: bean必須重命名,bean默認名是 jasyptStringEncryptor,當我們要自定義加密方案的時候,就必須重命名。
注意2: 需要在配置文件中加入如下配置:
jasypt:
encryptor:
bean: myStringEncryptor并修改測試類:
@Autowired
private StringEncryptor myStringEncryptor;2. 部署方案
密鑰(鹽值)存儲說明: 本身加解密過程都是通過鹽值進行處理的,所以正常情況下鹽值和加密串是分開存儲的。鹽值應該放在系統(tǒng)屬性、命令行或是環(huán)境變量來使用,而不是放在配置文件。
程序啟動 命令行參數(shù):
java -jar xxx.jar --jasypt.encryptor.password=Chen &
程序啟動 環(huán)境變量:
java -jar -Djasypt.encryptor.password=Chen xxx.jar
3. 輸出密文的幾種方案
優(yōu)化1.: 上面的寫法是直接寫死了需要加密的密碼,我們可以換一種在配置文件中讀取數(shù)據(jù)庫密碼的寫法,如下:
import org.jasypt.encryption.StringEncryptor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* @Author: chenJY
* @Description:
* @Date: 2022-11-18 9:19
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class EncryptorTest {
@Resource
private ApplicationContext applicationContext;
@Resource
private StringEncryptor jasyptStringEncryptor;
@Test
public void encode() {
Environment environment = applicationContext.getEnvironment();
String password = environment.getProperty("spring.datasource.dynamic.postgresql.password");
System.out.println( "加密密文:" + jasyptStringEncryptor.encrypt(password) );
System.out.println("解密密文:" + jasyptStringEncryptor.decrypt(jasyptStringEncryptor.encrypt(password)));
}
}
優(yōu)化2: 重寫啟動類的run(),實現(xiàn)每次啟動項目都會輸出一次加密密文
import org.jasypt.encryption.StringEncryptor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
@SpringBootApplication
public class TestDemoApplication implements CommandLineRunner{
@Resource
private ApplicationContext applicationContext;
@Resource
private StringEncryptor jasyptStringEncryptor;
public static void main(String[] args) {
SpringApplication.run(TestDemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
Environment environment = applicationContext.getEnvironment();
String pwd = environment.getProperty("spring.datasource.dynamic.postgresql.password");
// 打印解密后的結果
System.out.println( "加密密文:" + jasyptStringEncryptor.encrypt(pwd) );
}
}
總結
到此這篇關于Springboot實現(xiàn)ENC加密的詳細流程的文章就介紹到這了,更多相關Springboot實現(xiàn)ENC加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
利用Java實現(xiàn)word導入導出富文本(含圖片)的詳細代碼
這篇文章主要為大家詳細介紹了利用Java實現(xiàn)word導入導出富文本(含圖片),文中的示例代碼講解詳細,對大家的學習或工作有一定的幫助,感興趣的小伙伴可以學習一下2024-02-02
SpringBoot項目從開發(fā)到打包發(fā)布的完整教程
本文手把手帶你從零搭建 SpringBoot 項目,實現(xiàn)Redis 緩存 + MySQL 日志 + 第三方接口調(diào)用,并完成服務器打包部署,全程與 Node.js 對比,新手也能快速上手,需要的朋友可以參考下2026-04-04
將java普通項目打包成exe可執(zhí)行文件的步驟記錄
將JAVA代碼打包為exe文件,會讓程序運行更加方便,這篇文章主要給大家介紹了關于將java普通項目打包成exe可執(zhí)行文件的相關資料,需要的朋友可以參考下2021-07-07
解決springboot生成bean名稱沖突(AnnotationBeanNameGenerator)
這篇文章主要介紹了解決springboot生成bean名稱沖突(AnnotationBeanNameGenerator),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

