Spring Boot: 加密應用配置文件敏感信息

背景

  1. 我們的應用之前使用的是Druid數據庫連接池,由于需求我們遷移到HikariCP連接池,druid 數據源加密提供了多種方式:
  • 可以在配置文件my.properties中指定config.decrypt=true
  • 也可以在DruidDataSource的ConnectionProperties中指定config.decrypt=true
  • 也可以在jvm啟動參數中指定-Ddruid.config.decrypt=true
    但是HikariCP 默認沒有提供實現數據源加解密的方法
  1. 應用中會存在多個需要配置敏感信息(比如stfp等),都需要加密,類似于druid加解密方式依賴于工具類的實現,沒有統一的加解密標準,麻煩、而且不好維護。

Spring Cloud Config 的解決方案

  1. Config Server 加解密依賴JDK的JCE。
    JDK8的下載地址

  2. 配置config serve encrypt.key=foo

  3. 使用config server 提供的加解密接口生成密文

curl localhost:4001/encrypt -d lengleng
密文

  1. 配置文件使用密文
spring:
  datasource:
    password: '{ciper}密文'

xxx: '{ciper}密文'    
    
  1. 其他的非對稱加密等高級配置,參考官方文檔。注意一個bug (No key was installed for encryption service

jasypt 的解決方案

  1. Maven依賴
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>1.16</version>
</dependency>
  1. 配置
jasypt:
  encryptor:
    password: foo #根密碼
  1. 調用JAVA API 生成密文
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = PigAdminApplication.class)
public class PigAdminApplicationTest {
    @Autowired
    private StringEncryptor stringEncryptor;

    @Test
    public void testEnvironmentProperties() {
        System.out.println(stringEncryptor.encrypt("lengleng"));
    }

}

  1. 配置文件中使用密文
spring:
  datasource:
    password: ENC(密文)

xxx: ENC(密文)
  1. 其他非對稱等高級配置參考

總結

  1. Spring Cloud Config 提供了統一的加解密方式,方便使用,但是如果應用配置沒有走配置中心,那么加解密過濾是無效的;依賴JCE 對于低版本spring cloud的兼容性不好。
  2. jasypt 功能更為強大,支持的加密方式更多,但是如果多個微服務,需要每個服務模塊引入依賴配置,較為麻煩;但是功能強大 、靈活。
  3. 個人選擇 jasypt
  4. 源碼參考: 基于Spring Cloud、JWT 的微服務權限系統設計
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。