背景
- 我們的應(yīng)用之前使用的是Druid數(shù)據(jù)庫連接池,由于需求我們遷移到HikariCP連接池,druid 數(shù)據(jù)源加密提供了多種方式:
- 可以在配置文件my.properties中指定config.decrypt=true
- 也可以在DruidDataSource的ConnectionProperties中指定config.decrypt=true
- 也可以在jvm啟動(dòng)參數(shù)中指定-Ddruid.config.decrypt=true
但是HikariCP 默認(rèn)沒有提供實(shí)現(xiàn)數(shù)據(jù)源加解密的方法
- 應(yīng)用中會(huì)存在多個(gè)需要配置敏感信息(比如stfp等),都需要加密,類似于druid加解密方式依賴于工具類的實(shí)現(xiàn),沒有統(tǒng)一的加解密標(biāo)準(zhǔn),麻煩、而且不好維護(hù)。
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}密文'
- 其他的非對(duì)稱加密等高級(jí)配置,參考官方文檔。注意一個(gè)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 #根密碼
- 調(diào)用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(密文)
總結(jié)
- Spring Cloud Config 提供了統(tǒng)一的加解密方式,方便使用,但是如果應(yīng)用配置沒有走配置中心,那么加解密過濾是無效的;依賴JCE 對(duì)于低版本spring cloud的兼容性不好。
- jasypt 功能更為強(qiáng)大,支持的加密方式更多,但是如果多個(gè)微服務(wù),需要每個(gè)服務(wù)模塊引入依賴配置,較為麻煩;但是功能強(qiáng)大 、靈活。
- 個(gè)人選擇 jasypt
- 源碼參考: 基于Spring Cloud、JWT 的微服務(wù)權(quán)限系統(tǒng)設(shè)計(jì)