在微服务中开发过程中,团队通常采用 DevOps 开发模式开发,也就是每个微服务团队管理自己的微服务项目,但是一些敏感的数据源不应该直接明文存储于配置文件中,Spring Cloud 早就想到了这一点,提供了配置文件对称加密和非对称解密方案。比如下面的例子:
spring.datasource.username=didi
spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b
{cipher} 关键字标识该配置属性为加密属性,需要配置中心解密后使用,解决了在配置文件中出现明文密码的问题。
使用加密需要安装 JCE ,JCE 为 JDK 自带的加密解密包,但是自带的有长度限制,需要去 Oracle 官网下载无长度限制的包然后做一下替换,这里给出下载地址和说明(公众号发送:JCE 获取下载地址):
下载好以后解压出来是两个 jar 包,替换到本机 JDK 目录中的 jre/lib/security 中并且修改权限为 777 ,替换好以后结果如下:
尝试启动配置中心,访问 http://ip:port/encrypt/status 响应如下:
{"description":"The encryption algorithm is not strong enough","status":"INVALID"}
显然,我们只配置了 JCE 还没有配置秘钥,没办法加密,我们在配置中心项目中的 bootstrap.yaml 中添加
(这里有同学可能会有疑问,为什么是bootstrap.yaml 而不是 application.yaml ,原因是配置文件的加载顺序问题,写在application中会有加载顺序问题)
encrypt:
key: didispace
重新启动项目,响应如下,证明我们的JCE加密解密彻底配置完成:
{"status":"OK"}
使用 Postman 访问配置中心测试一下加密加密,这里我们使用的秘钥为:bsbk110 (也就是本公众号的id)
加密:
解密:
为了方便起见,我们直接复制这一串已经加密的 testpassword 到项目中尝试使用:
访问配置中心响应如下,我们看到 datasource.password 属性已经被解密返回:
我们尝试启动客户端尝试是否可以正确的加载到项目中,这里我们直接使用一个 Controller 来注入这个属性然后访问接口查看结果:
打开浏览器访问 /getPassword,成功
以上就是配置中心属性对称加密 RSA 的解决方案,当然也可以使用非对称数据加密解密方式,安全性更高,对于项目安全性有更高要求的可以通过查阅资料实现,我也查找了一些资料给大家参考使用:
https://pivotal.io/application-modernization-recipes/security/encrypt-decrypt-keys-using-spring-cloud-config-server
文图来自 medium