Spring Boot: 加密應用配置檔案敏感資訊

冷冷gg發表於2017-12-11

背景

  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. 其他非對稱等高階配置參考
KeyRequired
jasypt.encryptor.passwordTrue 根密碼
jasypt.encryptor.algorithmFalsePBEWithMD5AndDES
jasypt.encryptor.keyObtentionIterationsFalse1000
jasypt.encryptor.poolSizeFalse1
jasypt.encryptor.providerNameFalseSunJCE
jasypt.encryptor.saltGeneratorClassnameFalseorg.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.stringOutputTypeFalsebase64
jasypt.encryptor.proxyPropertySourcesFalsefalse

總結

  1. Spring Cloud Config 提供了統一的加解密方式,方便使用,但是如果應用配置沒有走配置中心,那麼加解密過濾是無效的;依賴JCE 對於低版本spring cloud的相容性不好。
  2. jasypt 功能更為強大,支援的加密方式更多,但是如果多個微服務,需要每個服務模組引入依賴配置,較為麻煩;但是功能強大 、靈活。
  3. 個人選擇 jasypt
  4. 原始碼參考: 基於Spring Cloud、JWT 的微服務許可權系統設計

相關文章