一個依賴搞定Spring Boot 配置檔案脫敏
經常會遇到這樣一種情況:專案的配置檔案中總有一些敏感資訊,比如資料來源的url、使用者名稱、密碼....這些資訊一旦被暴露那麼整個資料庫都將會被洩漏,那麼如何將這些配置隱藏呢?
今天介紹一種方案,讓你在無感知的情況下實現配置檔案的加密、解密。利用一款開源外掛:jasypt-spring-boot。專案地址如下:
http://github.com/ulisesbocchio/jasypt-spring-boot
使用方法很簡單,整合Spring Boot 只需要新增一個starter。
1. 新增依賴
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
2. 配置祕鑰
在配置檔案中新增一個加密的祕鑰(任意),如下:
jasypt: encryptor: password: Y6M9fAJQdU7jNp5MW
當然將祕鑰直接放在配置檔案中也是不安全的,我們可以在專案啟動的時候配置祕鑰,命令如下:
java -jar xxx.jar -Djasypt.encryptor.password=Y6M9fAJQdU7jNp5MW
3. 生成加密後的資料
這一步驟是將配置明文進行加密,程式碼如下:
@SpringBootTest @RunWith(SpringRunner.class) public class SpringbootJasyptApplicationTests { /** * 注入加密方法 */ @Autowired private StringEncryptor encryptor; /** * 手動生成密文,此處演示了url,user,password */ @Test public void encrypt() { String url = encryptor.encrypt("jdbc\\:mysql\\://127.0.0.1\\:3306/test?useUnicode\\=true&characterEncoding\\=UTF-8&zeroDateTimeBehavior\\=convertToNull&useSSL\\=false&allowMultiQueries\\=true&serverTimezone=Asia/Shanghai"); String name = encryptor.encrypt("root"); String password = encryptor.encrypt("123456"); System.out.println("database url: " + url); System.out.println("database name: " + name); System.out.println("database password: " + password); Assert.assertTrue(url.length() > 0); Assert.assertTrue(name.length() > 0); Assert.assertTrue(password.length() > 0); } }
上述程式碼對資料來源的url、user、password進行了明文加密,輸出的結果如下:
database url: szkFDG56WcAOzG2utv0m2aoAvNFH5g3DXz0o6joZjT26Y5WNA+1Z+pQFpyhFBokqOp2jsFtB+P9b3gB601rfas3dSfvS8Bgo3MyP1nojJgVp6gCVi+B/XUs0keXPn+pbX/19HrlUN1LeEweHS/LCRZslhWJCsIXTwZo1PlpXRv3Vyhf2OEzzKLm3mIAYj51CrEaN3w5cMiCESlwvKUhpAJVz/uXQJ1spLUAMuXCKKrXM/6dSRnWyTtdFRost5cChEU9uRjw5M+8HU3BLemtcK0vM8iYDjEi5zDbZtwxD3hA= database name: L8I2RqYPptEtQNL4x8VhRVakSUdlsTGzEND/3TOnVTYPWe0ZnWsW0/5JdUsw9ulm database password: EJYCSbBL8Pmf2HubIH7dHhpfDZcLyJCEGMR9jAV3apJtvFtx9TVdhUPsAxjQ2pnJ
4. 將加密後的密文寫入配置
jasypt預設使用ENC()包裹,此時的資料來源配置如下:
spring: datasource: # 資料來源基本配置 username: ENC(L8I2RqYPptEtQNL4x8VhRVakSUdlsTGzEND/3TOnVTYPWe0ZnWsW0/5JdUsw9ulm) password: ENC(EJYCSbBL8Pmf2HubIH7dHhpfDZcLyJCEGMR9jAV3apJtvFtx9TVdhUPsAxjQ2pnJ) driver-class-name: com.mysql.jdbc.Driver url: ENC(szkFDG56WcAOzG2utv0m2aoAvNFH5g3DXz0o6joZjT26Y5WNA+1Z+pQFpyhFBokqOp2jsFtB+P9b3gB601rfas3dSfvS8Bgo3MyP1nojJgVp6gCVi+B/XUs0keXPn+pbX/19HrlUN1LeEweHS/LCRZslhWJCsIXTwZo1PlpXRv3Vyhf2OEzzKLm3mIAYj51CrEaN3w5cMiCESlwvKUhpAJVz/uXQJ1spLUAMuXCKKrXM/6dSRnWyTtdFRost5cChEU9uRjw5M+8HU3BLemtcK0vM8iYDjEi5zDbZtwxD3hA=) type: com.alibaba.druid.pool.DruidDataSource
上述配置是使用預設的prefix=ENC(、suffix=),當然我們可以根據自己的要求更改,只需要在配置檔案中更改即可,如下:
jasypt: encryptor: ## 指定字首、字尾 property: prefix: 'PASS(' suffix: ')'
那麼此時的配置就必須使用PASS()包裹才會被解密,如下:
spring: datasource: # 資料來源基本配置 username: PASS(L8I2RqYPptEtQNL4x8VhRVakSUdlsTGzEND/3TOnVTYPWe0ZnWsW0/5JdUsw9ulm) password: PASS(EJYCSbBL8Pmf2HubIH7dHhpfDZcLyJCEGMR9jAV3apJtvFtx9TVdhUPsAxjQ2pnJ) driver-class-name: com.mysql.jdbc.Driver url: PASS(szkFDG56WcAOzG2utv0m2aoAvNFH5g3DXz0o6joZjT26Y5WNA+1Z+pQFpyhFBokqOp2jsFtB+P9b3gB601rfas3dSfvS8Bgo3MyP1nojJgVp6gCVi+B/XUs0keXPn+pbX/19HrlUN1LeEweHS/LCRZslhWJCsIXTwZo1PlpXRv3Vyhf2OEzzKLm3mIAYj51CrEaN3w5cMiCESlwvKUhpAJVz/uXQJ1spLUAMuXCKKrXM/6dSRnWyTtdFRost5cChEU9uRjw5M+8HU3BLemtcK0vM8iYDjEi5zDbZtwxD3hA=) type: com.alibaba.druid.pool.DruidDataSource
5. 總結
jasypt還有許多高階用法,比如可以自己配置加密演算法,具體的操作可以參考Github上的文件。
「其他文章」
- Android 自定義View - 柱狀波形圖 wave view
- Android技術分享|【Android踩坑】懷疑人生,主執行緒修改UI也會崩潰?
- 安卓TV外掛化9.0內聯崩潰原因及解決方案
- 測試員進階技能:如何有效地利用單元測試報告?
- Tekton 實戰完整示例
- 位元組的前端監控 SDK 是怎樣設計的
- 用Python繪製了若干張詞雲圖,驚豔了所有人
- 馬化騰:為什麼你們不在乎QQ等級,不用QQ了嗎?
- 幾個友好Java程式碼習慣建議
- Python 實現單例模式的五種寫法
- 挑戰不再寫Python for 迴圈
- HarmonyOS應用開發:鴻蒙JS實戰,計算器功能開發!
- Vitest:替代 Jest 的前端測試工具新選擇
- Vue的遞迴元件:渲染巢狀評論
- 在 Web 應用的執行時實現多分支並存和切換
- Umd 的包如何匯出 TS 型別
- Volatile:JVM 我警告你,我的人你別亂動
- 大反轉,iOS15.6比iOS14.8優化更好,續航提升很滿意,推薦升級
- “整潔架構” 和商家前端的重構之路
- 中文文字智慧糾錯知多少?