資料庫密碼配置項都不加密?心也太大了吧!
先看一份典型的配置檔案
... 省略 ...
## 配置MySQL資料庫連線
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簡訊服務連線
ali.sms.access_key_id=2zHmLdxAes7Bbe2w
ali.sms.access_key_secret=bImWdv6iy0him8ly
... 省略 ...
這是節選自某個典型的Spring Boot專案的application.properties
配置檔案。
噓… 偷偷告訴我,是不是很多小夥伴也都是這麼寫的?
這乍一看沒啥問題,很多人會覺得理所當然。包括我自己也看到過很多的專案(包括很多開源專案)是這麼寫的。
但仔細一琢磨,發現:
是的! 很多專案的配置檔案裡,包括資料庫密碼、快取密碼、亦或是一些第三方服務的Key都是直接配在裡面,沒有做任何加密處理!
有人會說這個配置檔案反正是我自己的,有啥風險?
這個嘛,之前倒是看到過一個例子,一個程式設計師把自己公司的專案程式碼上傳到了自己的GitHub倉庫裡了,結果配置檔案忘了處理,導致公司資料庫洩露,關鍵問題是,這個公司還是個酒店管理公司,因此後果可想而知了…
換個角度想,假如當時那個專案的配置檔案裡,所有重要資訊都經過了加密,那這一幕大機率就不會發生了。所以,即使是專案的配置檔案,重要的資訊也得加密!
哪些資訊要加密呢?
一般來說,專案配置檔案裡,所有涉及資訊保安的配置項(或欄位)都應該做處理,典型的比如:
- 用到的資料庫、快取的密碼
- 用到的中介軟體、訊息佇列的密碼
- 用到的各種第三方服務的Access_Key
- 其他第三方服務的通訊資訊
- …等等
總而言之,關鍵欄位都應該保護起來,最起碼不能用明文直接寫在配置檔案裡!
如何加密配置項呢?
方法非常簡單,幾個步驟即可完成,先來演示一個最簡版本:
1、首先建立一個基礎的Spring Boot工程
這就不再贅述了
2、引入jasypt-spring-boot
加密元件
透過jasypt-spring-boot
這個開箱即用的加密元件來引入Jasypt
這個強大的加密庫
<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
會使用這個自定義加密金鑰,對配置檔案裡的重要項進行加密。
4、加密測試
為了便於測試,我們直接擴充套件Spring Boot專案的啟動類,專案啟動時執行加密測試程式碼,直接看效果
@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 );
// 列印加密前後的結果對比
System.out.println( "MySQL原始明文密碼為:" + mysqlOriginPswd );
System.out.println( "Redis原始明文密碼為:" + redisOriginPswd );
System.out.println( "阿里雲SMS原始AccessKey密碼為:" + aliSmsOriginAk );
System.out.println( "====================================" );
System.out.println( "MySQL原始明文密碼加密後的結果為:" + mysqlEncryptedPswd );
System.out.println( "Redis原始明文密碼加密後的結果為:" + redisEncryptedPswd );
System.out.println( "阿里雲SMS原始AccessKey密碼加密後的結果為:" + 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;
}
}
執行專案,控制檯列印:
MySQL原始明文密碼為:123456
Redis原始明文密碼為:111111
阿里雲SMS原始AccessKey密碼為:bImWdv13da894mly
====================================
MySQL原始明文密碼加密後的結果為:IV7SyeQOfG4GhiXeGLboVgOLPDO+dJMDoOdmEOQp3KyVjruI+dKKeehsTriWPKbo
Redis原始明文密碼加密後的結果為:litUkxJ3fN6+//Emq3vZ+y4o7ZOnZ8doOy7NrgJIDLoNWGG0m3ygGeQh/dEroKvv
阿里雲SMS原始AccessKey密碼加密後的結果為:MAhrOs20DY0RU/c1IKyLCt6dWZqLLOO4wUcK9GBgSxNII3C+y+SRptors+FyNz55xNDslhDnpWllhcYPwZsO5A==
5、修改配置檔案,替換待加密配置項
我們拿到上一步得到的加密結果,將配置檔案中的原始明文密碼替換成上一步對應的結果即可,就像這樣:
所以牆裂建議配置檔案裡的所有重要資訊都這樣處理!
6、檢視密碼解密結果
@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");
// 列印解密後的結果
System.out.println( "MySQL原始明文密碼為:" + mysqlOriginPswd );
System.out.println( "Redis原始明文密碼為:" + redisOriginPswd );
System.out.println( "阿里雲SMS原始AccessKey密碼為:" + aliSmsOriginAk );
}
}
列印結果:
MySQL原始明文密碼為:123456
Redis原始明文密碼為:111111
阿里雲SMS原始AccessKey密碼為:bImWdv13da894mly
很明顯,在程式碼中使用時,jasypt-spring-boot
元件會自動將ENC()
語法包裹的配置項加密欄位自動解密,資料得以還原。
小朋友,你是否有很多問號?
這時候我想肯定很多小夥伴表示疑惑,典型的比如:
1、加密金鑰必須放在ENC()
中?為什麼是ENC
?
2、雖然說原始涉及資訊保安的配置項被加密,但是自定義的加密金鑰jasypt.encryptor.password=CodeSheep
假如洩露了,別人不還是有機率可以解密的嗎?
針對這些問題,繼續往下看。
自定義加密前字尾
如果不願意使用jasypt
預設提供的ENC
來標記加密欄位,完全可以換成自定義的前字尾標記,比如我想換成CodeSheep()
來標記加密欄位,此時只需要在配置檔案裡配置一下前字尾即可:
jasypt.encryptor.property.prefix=CodeSheep(
jasypt.encryptor.property.suffix=)
這時候加密欄位就可以放在CodeSheep()
標記的欄位中:
讓加密更安全
雖然經過上文的加密,涉及資訊保安的配置項肯定會變得更安全,這個毋庸置疑!
但是假如配置檔案裡的自定義加密金鑰jasypt.encryptor.password=CodeSheep
洩露了,那我們的加密欄位也還是有可能被別人解密,為此,有幾項工作可以讓加密變得更加安全。
1、使用自定義加密器
上文實驗加密時,使用的是預設的加密規則,這一點會讓當自定義加密金鑰洩漏時可能變得不安全。為此我們可以自定義加密規則。
自定義加密規則非常簡單,只需要提供自定義的加密器配置類即可,比如我這裡自定義一個名為 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
是需要顯式指定的(預設的名字是jasyptStringEncryptor
),如果像這裡一樣用的自定義名字,則還需要在Spring Boot的application.properties
配置檔案中來指定bean
的名字,就像這樣:
jasypt.encryptor.bean=codeSheepEncryptorBean
2、加密金鑰不要寫在配置檔案中
如果覺得上面這種方式還是可能會導致加密金鑰洩露的話(畢竟還是寫在了配置檔案中),那我們乾脆可以直接將加密金鑰從配置檔案中拿掉,取而代之的有三種方式:
- 方式一:直接作為程式啟動時的命令列引數來帶入
java -jar yourproject.jar --jasypt.encryptor.password=CodeSheep
- 方式二:直接作為程式啟動時的應用環境變數來帶入
java -Djasypt.encryptor.password=CodeSheep -jar yourproject.jar
- 方式三:甚至可以作為系統環境變數的方式來帶入
比方說,我們提前設定好系統環境變數JASYPT_ENCRYPTOR_PASSWORD = CodeSheep
,則直接在Spring Boot的專案配置檔案中做如下配置即可:
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
這時候也會安全得多。
噓…
好了,說了這麼多,如果你專案的配置檔案中的重要資訊沒有加密的話,答應我,二話別說,趕快全部偷偷去改掉,快!速度!跑步前進!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2983/viewspace-2825304/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 配置Golden Gate 密碼加密Go密碼加密
- ogg登陸資料庫使用者密碼加密資料庫密碼加密
- 使用MD5Util工具包對資料庫密碼加密資料庫密碼加密
- 資料庫密碼爆破HexorBase資料庫密碼HexoORB
- MySQL 資料庫重置密碼MySql資料庫密碼
- laravel、lumen等.env檔案資料庫密碼配置正確,連不上資料庫Laravel資料庫密碼
- oracle 資料庫密碼中包括@Oracle資料庫密碼
- 資料庫加密資料庫加密
- SQLServer資料庫日誌太大處理方式SQLServer資料庫
- MySQL資料庫入門多例項配置MySql資料庫
- 資料加密-國密SM2對資料進行加密加密
- MySQL 配置資料庫編碼MySql資料庫
- 織夢資料庫裡改密碼資料庫密碼
- discuz資料庫遷移,改密碼後,相關配置檔案修改資料庫密碼
- Sharding-JDBC使用jasypt3.0及以上版本加密資料庫連線密碼JDBC加密資料庫密碼
- spring-boot-route(十一)資料庫配置資訊加密Springboot資料庫加密
- Mac怎麼給資料夾設定密碼?mac資料夾加密教程Mac密碼加密
- 資料夾能直接設定密碼嗎 資料夾加密的常用方法密碼加密
- 程式碼review,程式碼審查,用upsource 也太方便了吧View
- 解密MSSQL連結資料庫的密碼解密SQL資料庫密碼
- Oracle資料庫密碼延遲驗證Oracle資料庫密碼
- 啟用oracle資料庫密碼函式Oracle資料庫密碼函式
- 網站資料庫密碼怎麼修改?網站資料庫密碼
- 忘記MySQL資料庫root密碼,使用安全模式巧妙重置密碼MySql資料庫密碼模式
- ajax讀取資料庫資料程式碼例項資料庫
- 中興資料庫的決心資料庫
- oracle 資料庫加加密。Oracle資料庫加密
- SpringBoot專案配置檔案中密碼的加密Spring Boot密碼加密
- 打死也不說”的大資料祕密大資料
- 可穿戴加密貨幣錢包Trove來了 不再擔心密碼被盜加密密碼
- 1.7.8. 刪除資料庫密碼檔案資料庫密碼
- 年底了,你的資料庫密碼安全嗎資料庫密碼
- 資料庫到底應該如何儲存密碼?資料庫密碼
- 記下改變資料庫密碼的命令資料庫密碼
- 資料夾不壓縮直接設定密碼 怎麼給資料夾直接加密密碼加密
- Nodejs差不多也到頂峰了吧?NodeJS
- 帝國CMS7.5資料庫密碼忘記了如何找回(找回帝國CMS 7.5資料庫密碼的方法)資料庫密碼
- 拿走磁碟也甭想讀資料——透明加密保安全加密