zl程序教程

您现在的位置是:首页 >  后端

当前栏目

SpringCloud 构建微服务架构,分布式配置中心(加密解密)

2023-06-13 09:17:10 时间

在微服务中开发过程中,团队通常采用 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