溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中如何給數(shù)據(jù)庫加密配置項

發(fā)布時間:2021-11-03 09:55:29 來源:億速云 閱讀:207 作者:iii 欄目:編程語言

這篇文章主要講解了“Java中如何給數(shù)據(jù)庫加密配置項”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java中如何給數(shù)據(jù)庫加密配置項”吧!

先看一份典型的配置文件

... 省略 ...

## 配置MySQL數(shù)據(jù)庫連接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://121.196.xxx.xxx:3306/user?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

## 配置Redis緩存連接
redis.host=121.196.xxx.xxx
redis.port=6379
redis.password=111111

## 配置SMS短信服務(wù)連接
ali.sms.access_key_id=2zHmLdxAes7Bbe2w  
ali.sms.access_key_secret=bImWdv6iy0him8ly

... 省略 ...

這是節(jié)選自某個典型的Spring Boot項目的application.properties配置文件。

噓… 偷偷告訴我,是不是很多小伙伴也都是這么寫的?

這乍一看沒啥問題,很多人會覺得理所當(dāng)然。包括我自己也看到過很多的項目(包括很多開源項目)是這么寫的。

但仔細(xì)一琢磨,發(fā)現(xiàn):

Java中如何給數(shù)據(jù)庫加密配置項

是的! 很多項目的配置文件里,包括數(shù)據(jù)庫密碼、緩存密碼、亦或是一些第三方服務(wù)的Key都是直接配在里面,沒有做任何加密處理!

有人會說這個配置文件反正是我自己的,有啥風(fēng)險?

這個嘛,之前倒是看到過一個例子,一個程序員把自己公司的項目代碼上傳到了自己的GitHub倉庫里了,結(jié)果配置文件忘了處理,導(dǎo)致公司數(shù)據(jù)庫泄露,關(guān)鍵問題是,這個公司還是個酒店管理公司,因此后果可想而知了…

Java中如何給數(shù)據(jù)庫加密配置項

換個角度想,假如當(dāng)時那個項目的配置文件里,所有重要信息都經(jīng)過了加密,那這一幕大概率就不會發(fā)生了。所以,即使是項目的配置文件,重要的信息也得加密!


哪些信息要加密呢?

一般來說,項目配置文件里,所有涉及信息安全的配置項(或字段)都應(yīng)該做處理,典型的比如:

  • 用到的數(shù)據(jù)庫、緩存的密碼

  • 用到的中間件、消息隊列的密碼

  • 用到的各種第三方服務(wù)的Access_Key

  • 其他第三方服務(wù)的通信信息

  • …等等

總而言之,關(guān)鍵字段都應(yīng)該保護(hù)起來,最起碼不能用明文直接寫在配置文件里!


如何加密配置項呢?

方法非常簡單,幾個步驟即可完成,先來演示一個最簡版本:

1、首先建立一個基礎(chǔ)的Spring Boot工程

這就不再贅述了

2、引入jasypt-spring-boot加密組件

通過jasypt-spring-boot這個開箱即用的加密組件來引入Jasypt這個強(qiáng)大的加密庫

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

3、配置加密密鑰

在Spring Boot的項目配置文件application.properties里新增如下配置:

jasypt.encryptor.password=CodeSheep

可以理解為jasypt會使用這個自定義加密密鑰,對配置文件里的重要項進(jìn)行加密。

4、加密測試

為了便于測試,我們直接擴(kuò)展Spring Boot項目的啟動類,項目啟動時執(zhí)行加密測試代碼,直接看效果

@SpringBootApplication
public class SpringBootConfigEncryptApplication implements CommandLineRunner {

   @Autowired
   private ApplicationContext appCtx;

   @Autowired
   private StringEncryptor codeSheepEncryptorBean;

   public static void main(String[] args) {
       SpringApplication.run(SpringBootConfigEncryptApplication.class, args);
   }

   @Override
   public void run(String... args) throws Exception {

       Environment environment = appCtx.getBean(Environment.class);

       // 首先獲取配置文件里的原始明文信息
       String mysqlOriginPswd = environment.getProperty("spring.datasource.password");
       String redisOriginPswd = environment.getProperty("redis.password");
       String aliSmsOriginAk = environment.getProperty("ali.sms.access_key_secret");

       // 加密
       String mysqlEncryptedPswd = encrypt( mysqlOriginPswd );
       String redisEncryptedPswd = encrypt( redisOriginPswd );
       String aliSmsEncryptedAk = encrypt( aliSmsOriginAk );

       // 打印加密前后的結(jié)果對比
       System.out.println( "MySQL原始明文密碼為:" + mysqlOriginPswd );
       System.out.println( "Redis原始明文密碼為:" + redisOriginPswd );
       System.out.println( "阿里云SMS原始AccessKey密碼為:" + aliSmsOriginAk );
       System.out.println( "====================================" );
       System.out.println( "MySQL原始明文密碼加密后的結(jié)果為:" + mysqlEncryptedPswd );
       System.out.println( "Redis原始明文密碼加密后的結(jié)果為:" + redisEncryptedPswd );
       System.out.println( "阿里云SMS原始AccessKey密碼加密后的結(jié)果為:" + aliSmsEncryptedAk );
   }

   private String encrypt( String originPassord ) {
       String encryptStr = codeSheepEncryptorBean.encrypt( originPassord );
       return encryptStr;
   }

   private String decrypt( String encryptedPassword ) {
       String decryptStr = codeSheepEncryptorBean.decrypt( encryptedPassword );
       return decryptStr;
   }
}

運行項目,控制臺打?。?/p>

MySQL原始明文密碼為:123456
Redis原始明文密碼為:111111
阿里云SMS原始AccessKey密碼為:bImWdv13da894mly
====================================
MySQL原始明文密碼加密后的結(jié)果為:IV7SyeQOfG4GhiXeGLboVgOLPDO+dJMDoOdmEOQp3KyVjruI+dKKeehsTriWPKbo
Redis原始明文密碼加密后的結(jié)果為:litUkxJ3fN6+//Emq3vZ+y4o7ZOnZ8doOy7NrgJIDLoNWGG0m3ygGeQh/dEroKvv
阿里云SMS原始AccessKey密碼加密后的結(jié)果為:MAhrOs20DY0RU/c1IKyLCt6dWZqLLOO4wUcK9GBgSxNII3C+y+SRptors+FyNz55xNDslhDnpWllhcYPwZsO5A==

5、修改配置文件,替換待加密配置項

我們拿到上一步得到的加密結(jié)果,將配置文件中的原始明文密碼替換成上一步對應(yīng)的結(jié)果即可,就像這樣:

Java中如何給數(shù)據(jù)庫加密配置項

所以墻裂建議配置文件里的所有重要信息都這樣處理!

6、查看密碼解密結(jié)果

@SpringBootApplication
public class SpringBootConfigEncryptApplication implements CommandLineRunner {

   @Autowired
   private ApplicationContext appCtx;

   @Autowired
   private StringEncryptor codeSheepEncryptorBean;

   public static void main(String[] args) {
       SpringApplication.run(SpringBootConfigEncryptApplication.class, args);
   }

   @Override
   public void run(String... args) throws Exception {

       Environment environment = appCtx.getBean(Environment.class);

       // 首先獲取配置文件里的配置項
       String mysqlOriginPswd = environment.getProperty("spring.datasource.password");
       String redisOriginPswd = environment.getProperty("redis.password");
       String aliSmsOriginAk = environment.getProperty("ali.sms.access_key_secret");

       // 打印解密后的結(jié)果
       System.out.println( "MySQL原始明文密碼為:" + mysqlOriginPswd );
       System.out.println( "Redis原始明文密碼為:" + redisOriginPswd );
       System.out.println( "阿里云SMS原始AccessKey密碼為:" + aliSmsOriginAk );
   }
}    

打印結(jié)果:

MySQL原始明文密碼為:123456
Redis原始明文密碼為:111111
阿里云SMS原始AccessKey密碼為:bImWdv13da894mly

很明顯,在代碼中使用時,jasypt-spring-boot組件會自動將ENC()語法包裹的配置項加密字段自動解密,數(shù)據(jù)得以還原。


小朋友,你是否有很多問號?

這時候我想肯定很多小伙伴表示疑惑,典型的比如:

1、加密密鑰必須放在ENC()中?為什么是ENC?

2、雖然說原始涉及信息安全的配置項被加密,但是自定義的加密密鑰jasypt.encryptor.password=CodeSheep假如泄露了,別人不還是有幾率可以解密的嗎?

針對這些問題,繼續(xù)往下看。


自定義加密前后綴

如果不愿意使用jasypt默認(rèn)提供的ENC來標(biāo)記加密字段,完全可以換成自定義的前后綴標(biāo)記,比如我想換成CodeSheep()來標(biāo)記加密字段,此時只需要在配置文件里配置一下前后綴即可:

jasypt.encryptor.property.prefix=CodeSheep(
jasypt.encryptor.property.suffix=)

這時候加密字段就可以放在CodeSheep()標(biāo)記的字段中:

Java中如何給數(shù)據(jù)庫加密配置項


讓加密更安全

雖然經(jīng)過上文的加密,涉及信息安全的配置項肯定會變得更安全,這個毋庸置疑!

但是假如配置文件里的自定義加密密鑰jasypt.encryptor.password=CodeSheep泄露了,那我們的加密字段也還是有可能被別人解密,為此,有幾項工作可以讓加密變得更加安全。

1、使用自定義加密器

上文實驗加密時,使用的是默認(rèn)的加密規(guī)則,這一點會讓當(dāng)自定義加密密鑰泄漏時可能變得不安全。為此我們可以自定義加密規(guī)則。

自定義加密規(guī)則非常簡單,只需要提供自定義的加密器配置類即可,比如我這里自定義一個名為 codeSheepEncryptorBean類型的加密器:

@Configuration
public class CodeSheepEncryptorCfg {

   @Bean( name = "codeSheepEncryptorBean" )
   public StringEncryptor codesheepStringEncryptor() {

       PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

       SimpleStringPBEConfig config = new SimpleStringPBEConfig();
       config.setPassword("CodeSheep");
       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;
   }
}

注意這里Bean的名字name是需要顯式指定的(默認(rèn)的名字是jasyptStringEncryptor),如果像這里一樣用的自定義名字,則還需要在Spring Boot的application.properties配置文件中來指定bean的名字,就像這樣:

jasypt.encryptor.bean=codeSheepEncryptorBean

2、加密密鑰不要寫在配置文件中

如果覺得上面這種方式還是可能會導(dǎo)致加密密鑰泄露的話(畢竟還是寫在了配置文件中),那我們干脆可以直接將加密密鑰從配置文件中拿掉,取而代之的有三種方式:

  • 方式一:直接作為程序啟動時的命令行參數(shù)來帶入

java -jar yourproject.jar --jasypt.encryptor.password=CodeSheep
  • 方式二:直接作為程序啟動時的應(yīng)用環(huán)境變量來帶入

java -Djasypt.encryptor.password=CodeSheep -jar yourproject.jar
  • 方式三:甚至可以作為系統(tǒng)環(huán)境變量的方式來帶入

比方說,我們提前設(shè)置好系統(tǒng)環(huán)境變量JASYPT_ENCRYPTOR_PASSWORD = CodeSheep,則直接在Spring Boot的項目配置文件中做如下配置即可:

jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}

感謝各位的閱讀,以上就是“Java中如何給數(shù)據(jù)庫加密配置項”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java中如何給數(shù)據(jù)庫加密配置項這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI