背景
- 我們的應用之前使用的是Druid資料庫連線池,由於需求我們遷移到HikariCP連線池,druid 資料來源加密提供了多種方式:
- 可以在配置檔案my.properties中指定config.decrypt=true
- 也可以在DruidDataSource的ConnectionProperties中指定config.decrypt=true
- 也可以在jvm啟動引數中指定-Ddruid.config.decrypt=true
但是HikariCP 預設沒有提供實現資料來源加解密的方法
- 應用中會存在多個需要配置敏感資訊(比如stfp等),都需要加密,類似於druid加解密方式依賴於工具類的實現,沒有統一的加解密標準,麻煩、而且不好維護。
Spring Cloud Config 的解決方案
-
Config Server 加解密依賴JDK的JCE。 JDK8的下載地址:
-
配置config serve encrypt.key=foo
-
使用config server 提供的加解密介面生成密文
curl localhost:4001/encrypt -d lengleng
密文
複製程式碼
- 配置檔案使用密文
spring:
datasource:
password: '{ciper}密文'
xxx: '{ciper}密文'
複製程式碼
- 其他的非對稱加密等高階配置,參考官方文件。注意一個bug (No key was installed for encryption service)
jasypt 的解決方案
- Maven依賴
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.16</version>
</dependency>
複製程式碼
- 配置
jasypt:
encryptor:
password: foo #根密碼
複製程式碼
- 呼叫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"));
}
}
複製程式碼
- 配置檔案中使用密文
spring:
datasource:
password: ENC(密文)
xxx: ENC(密文)
複製程式碼
Key | Required | |
jasypt.encryptor.password | True | 根密碼 |
jasypt.encryptor.algorithm | False | PBEWithMD5AndDES |
jasypt.encryptor.keyObtentionIterations | False | 1000 |
jasypt.encryptor.poolSize | False | 1 |
jasypt.encryptor.providerName | False | SunJCE |
jasypt.encryptor.saltGeneratorClassname | False | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.stringOutputType | False | base64 |
jasypt.encryptor.proxyPropertySources | False | false |
總結
- Spring Cloud Config 提供了統一的加解密方式,方便使用,但是如果應用配置沒有走配置中心,那麼加解密過濾是無效的;依賴JCE 對於低版本spring cloud的相容性不好。
- jasypt 功能更為強大,支援的加密方式更多,但是如果多個微服務,需要每個服務模組引入依賴配置,較為麻煩;但是功能強大 、靈活。
- 個人選擇 jasypt
- 原始碼參考: 基於Spring Cloud、JWT 的微服務許可權系統設計