Spring Cloud构建微服务架构:分布式配置中心(加密解密)

在微服务架构中,我们通常都会采用DevOps的组织方式来降低因团队间沟通造成的巨大成本,以加速微服务应用的交付能力。这就使得原本由运维团队控制的线上信息将交由微服务所属组织的成员自行维护,其中将会包括大量的敏感信息,比如:数据库的账户与密码等。很显然,如果我们直接将敏感信息以明文的方式存储于微服务应用的配置文件中是非常危险的。针对这个问题,Spring Cloud Config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。比如下面的例子:

spring.datasource.username=didi
spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b

在Spring Cloud Config中通过在属性值前使用{cipher}前缀来标注该内容是一个加密值,当微服务客户端来加载配置时,配置中心会自动的为带有{cipher}前缀的值进行解密。通过该机制的实现,运维团队就可以放心的将线上信息的加密资源给到微服务团队,而不用担心这些敏感信息遭到泄露了。下面我们来具体介绍如何在配置中心使用该项功能。

使用前提

在使用Spring Cloud Config的加密解密功能时,有一个必要的前提需要我们注意。为了启用该功能,我们需要在配置中心的运行环境中安装不限长度的JCE版本(Unlimited Strength Java Cryptography Extension)。虽然,JCE功能在JRE中自带,但是默认使用的是有长度限制的版本。我们可以从Oracle的官方网站中下载到它,它是一个压缩包,解压后可以看到下面三个文件:

README.txt
local_policy.jar
US_export_policy.jar

我们需要将local_policy.jarUS_export_policy.jar两个文件复制到$JAVA_HOME/jre/lib/security目录下,覆盖原来的默认内容。到这里,加密解密的准备工作就完成了。

相关端点

在完成了JCE的安装后,可以尝试启动配置中心。在控制台中,将会输出了一些配置中心特有的端点,主要包括:

  • /encrypt/status:查看加密功能状态的端点
  • /key:查看密钥的端点
  • /encrypt:对请求的body内容进行加密的端点
  • /decrypt:对请求的body内容进行解密的端点

可以尝试通过GET请求访问/encrypt/status端点,我们将得到如下内容:

{
"description": "No key was installed for encryption service",
"status": "NO_KEY"
}

该返回说明当前配置中心的加密功能还不能使用,因为没有为加密服务配置对应的密钥。

配置密钥

我们可以通过encrypt.key属性在配置文件中直接指定密钥信息(对称性密钥),比如:

encrypt.key=didispace

加入上述配置信息后,重启配置中心,再访问/encrypt/status端点,我们将得到如下内容:

{
"status": "OK"
}

此时,我们配置中心的加密解密功能就已经可以使用了,不妨尝试访问一下/encrypt/decrypt端点来进行加密和解密的功能。注意,这两个端点都是POST请求,加密和解密信息需要通过请求体来发送。比如,以curl命令为例,我们可以通过下面的方式调用加密与解密端点:

$ curl localhost:7001/encrypt -d didispace
3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7

$ curl localhost:7001/decrypt -d 3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7
didispace

这里,我们通过配置encrypt.key参数来指定密钥的实现方式采用了对称性加密。这种方式实现比较简单,只需要配置一个参数即可。另外,我们也可以使用环境变量ENCRYPT_KEY来进行配置,让密钥信息外部化存储。

非对称加密

Spring Cloud Config的配置中心不仅可以使用对称性加密,也可以使用非对称性加密(比如:RSA密钥对)。虽然非对称性加密的密钥生成与配置相对复杂一些,但是它具有更高的安全性。下面,我们来具体介绍一下如何使用非对称加密。

首先,我们需要通过keytool工具来生成密钥对。keytool是JDK中的一个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。在JDK 1.4以后的版本中都包含了这一工具,它的位置在:%JAVA_HOME%\bin\keytool.exe

生成密钥的具体命令如下:

$ keytool -genkeypair -alias config-server -keyalg RSA -keystore config-server.keystore
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: zhaiyongchao
您的组织单位名称是什么?
[Unknown]: company
您的组织名称是什么?
[Unknown]: organization
您所在的城市或区域名称是什么?
[Unknown]: city
您所在的省/市/自治区名称是什么?
[Unknown]: province
该单位的双字母国家/地区代码是什么?
[Unknown]: china
CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china是否正确?
[否]: y

输入 <config-server> 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:

另外,如果我们不想逐步的输入那些提示信息,可以使用-dname来直接指定,而密钥库口令与密钥口令可使用-storepass-keypass来直接指定。所以,我们可以通过下面的命令直接创建出与上述命令一样的密钥库:

$ keytool -genkeypair -alias config-server -keyalg RSA \ 
-dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \
-keypass 222222 \
-keystore config-server.keystore \
-storepass 111111 \

默认情况下,上述命令创建的密钥只有90天有效期。如果我们想要调整它的有效期,可以通过增加-validity参数来实现,比如我们可以通过下面的命令,让密钥的有效期延长到一年:

$ keytool -genkeypair -alias config-server -keyalg RSA \ 
-dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \
-keypass 222222 \
-keystore config-server.keystore \
-storepass 111111 \
-validity 365 \

上述的三种命令生成方式,最终都会在命令的当前执行目录下生成一个config-server.keystore文件。下面,我们需要将它保存在配置中心的文件系统中的某个位置,比如放在当前的用户目录下,然后在配置中心中加入相关的配置信息:

encrypt.key-store.location=file://${user.home}/config-server.keystore
encrypt.key-store.alias=config-server
encrypt.key-store.password=111111
encrypt.key-store.secret=222222

如果我们将config-server.keystore放在配置中心的src/main/resource目录下,也可以直接这样配置:encrypt.key-store.location=config-server.keystore。另外,非对称加密的配置信息也可以通过环境变量的方式进行配置,它们对应的具体变量名如下:

ENCRYPT_KEY_STORE_LOCATION
ENCRYPT_KEY_STORE_ALIAS
ENCRYPT_KEY_STORE_PASSWORD
ENCRYPT_KEY_STORE_SECRET

通过环境变量来配置密钥库相关信息可以获得更好的安全性,所以我们可以将敏感的口令信息存储在配置中心的环境变量中是一种不错的选择。

以下专题教程也许您会有兴趣

  • Spring Boot基础教程
  • Spring Cloud基础教程

本文内容部分节选自我的《Spring Cloud微服务实战》,稍作改变和内容升级


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

112页机器学习数学知识整理!数学基础回顾.pptx

机器学习的基础是数学&#xff0c;数学基础决定了机器学习从业人员的上限&#xff0c;想要学好机器学习&#xff0c;就必须学好数学。这么多数学知识&#xff0c;不管是硕士阶段还是博士阶段的研究生&#xff0c;是没法学完全的&#xff0c;必须有所取舍&#xff0c;黄海广博士…

LeetCode 274. H指数(排序,哈希)

1. 题目 给定一位研究者论文被引用次数的数组&#xff08;被引用次数是非负整数&#xff09;。编写一个方法&#xff0c;计算出研究者的 h 指数。 h 指数的定义: “h 代表“高引用次数”&#xff08;high citations&#xff09;&#xff0c;一名科研人员的 h 指数是指他&…

论文浅尝 | 记忆推理:最近邻知识图谱嵌入

笔记整理&#xff1a;孙硕硕&#xff0c;东南大学硕士&#xff0c;研究方向为根因溯源。Citation: Zhang N, Xie X, Chen X, et al. Reasoning Through Memorization: Nearest Neighbor Knowledge Graph Embeddings[J]. arXiv preprint arXiv:2201.05575, 2022.动机大多数知识图…

LeetCode 275. H指数 II(二分查找)

1. 题目 给定一位研究者论文被引用次数的数组&#xff08;被引用次数是非负整数&#xff09;&#xff0c;数组已经按照升序排列。编写一个方法&#xff0c;计算出研究者的 h 指数。 h 指数的定义: “h 代表“高引用次数”&#xff08;high citations&#xff09;&#xff0c;…

Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

在Spring Cloud中我们用Hystrix来实现断路器&#xff0c;Zuul中默认是用信号量&#xff08;Hystrix默认是线程&#xff09;来进行隔离的&#xff0c;我们可以通过配置使用线程方式隔离。 在使用线程隔离的时候&#xff0c;有个问题是必须要解决的&#xff0c;那就是在某些业务…

如果再这么玩下去,中国的科研就没戏了

文 | 知识分子编者按&#xff1a;今天编发的这篇文章&#xff0c;是某国立研究所所长的内心自白。他的一家之言&#xff0c;道出了许多人不愿意面对的现实——中国科研表面上看起来一片繁荣&#xff0c;实际深藏危机&#xff0c;如果继续跟班式搞科研&#xff0c;中国科研就没戏…

Spring Cloud Feign的文件上传实现

在Spring Cloud封装的Feign中并不直接支持传文件&#xff0c;但可以通过引入Feign的扩展包来实现&#xff0c;本来就来具体说说如何实现。 服务提供方&#xff08;接收文件&#xff09; 服务提供方的实现比较简单&#xff0c;就按Spring MVC的正常实现方式即可&#xff0c;比…

论文浅尝 | 开放知识图谱构建必读:封闭域VS开放知识抽取与4大类开放抽取常用方法概述...

转载公众号| 老刘说NLP最近社区抛出一个关于开放知识抽取的话题&#xff0c;也是当前知识图谱构建的一个热点&#xff0c;希望能够介绍相关的工作&#xff0c;而在之前也做过一些工作&#xff0c;借着这个机会&#xff0c;写一篇文章&#xff0c;来跟大家谈谈这个问题。开放知识…

别再双塔了!谷歌提出DSI索引,检索效果吊打双塔,零样本超BM25!

卖萌屋今日学术精选这篇论文展示了信息检索可以用一个Transformer来完成&#xff0c;其中&#xff0c;关于语料库的所有信息都被编码在Transformer模型的参数中。论文标题&#xff1a;Transformer Memory as a Differentiable Search Index链接&#xff1a;https://arxiv.org/a…

LeetCode 71. 简化路径(栈)

1. 题目 以 Unix 风格给出一个文件的绝对路径&#xff0c;你需要简化它。或者换句话说&#xff0c;将其转换为规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&#xff1b;此外&#xff0c;两个点 &#xff08;..&#xff…

我有一段很厉害的代码,不外传的那种

文 | 郭忠明知乎最近在知乎上看到一个问题&#xff0c;叫做“程序员有没有很厉害、不外传的代码”。​好像在这个遍地都是开源项目的时代&#xff0c;啥代码都藏不住。但其实&#xff0c;是有的&#xff0c;而且有不少&#xff01;很多算法在没有公开前&#xff0c;普通程序员都…

开源开放 | OpenKG发布cnSchema重构版本

cnSchema网站&#xff1a;http://cnschema.openkg.cn/GitHub地址&#xff1a;https://github.com/cnschema/cnSchema开放许可协议&#xff1a;CC 0摘要cnSchema是由OpenKG管理和维护的面向中文知识图谱的Schema参考标准。结合中文语言特点和中文领域特点需求&#xff0c;cnSche…

Spring Cloud构建微服务架构:分布式服务跟踪(抽样收集)【Dalston版】

通过Trace ID和Span ID已经实现了对分布式系统中的请求跟踪&#xff0c;而这些记录的跟踪信息最终会被分析系统收集起来&#xff0c;并用来实现对分布式系统的监控和分析功能&#xff0c;比如&#xff1a;预警延迟过长的请求链路、查询请求链路的调用明细等。此时&#xff0c;我…

LeetCode 229. 求众数 II(摩尔投票)

1. 题目 给定一个大小为 n 的数组&#xff0c;找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 说明: 要求算法的时间复杂度为 O(n)&#xff0c;空间复杂度为 O(1)。 示例 1: 输入: [3,2,3] 输出: [3] 示例 2: 输入: [1,1,1,3,3,2,2,2] 输出: [1,2]来源&#xff1a;力扣&#xf…

95后CV工程师晒出工资单:狠补了这个,真香…

许多计算机视觉任务需要对图像进行智能分割&#xff0c;以理解图像中的内容&#xff0c;并使每个部分的分析更加容易。今天的图像分割技术使用计算机视觉深度学习模型来理解图像的每个像素所代表的真实物体&#xff0c;这在十年前是无法想象的。图像分割有助于确定目标之间的关…

论文浅尝 | CAKE:一个用于多视图知识图谱补全的可扩展性常识感知框架

笔记整理&#xff1a;陈子强&#xff0c;天津大学硕士链接&#xff1a;https://aclanthology.org/2022.acl-long.36.pdf动机以往的知识图谱补全仅仅依靠事实级别数据来预测实体之间缺失的关系&#xff0c;这样忽略了有价值的常识性知识。以往的知识图谱嵌入面临无效的负采样和事…

Spring Cloud构建微服务架构:分布式服务跟踪(收集原理)【Dalston版】

在本节内容之前&#xff0c;我们已经对如何引入Sleuth跟踪信息和搭建Zipkin服务端分析跟踪延迟的过程做了详细的介绍&#xff0c;相信大家对于Sleuth和Zipkin已经有了一定的感性认识。接下来&#xff0c;我们介绍一下关于Zipkin收集跟踪信息的过程细节&#xff0c;以帮助我们更…

LeetCode 263. 丑数 264. 丑数 II(DP)

文章目录1. LeetCode 263. 丑数解题2. LeetCode 264. 丑数 IIDP解题1. LeetCode 263. 丑数 编写一个程序判断给定的数是否为丑数。 丑数就是只包含质因数 2, 3, 5 的正整数。 示例 1: 输入: 6 输出: true 解释: 6 2 3示例 2: 输入: 8 输出: true 解释: 8 2 2 2示例 3: …

对比学习效果差?谷歌提出弱语义负样本,有效学习高级特征!

文 | jxyxiangyu编 | 小轶对比学习是 2021 年几大研究热点之一了。如果说预训练模型解决了机器学习对大规模标注数据的需求问题&#xff0c;那么&#xff0c;对比学习可以说是将无监督/自监督学习推广到更一般的应用场景&#xff0c;为苦于标注数据不多的炼丹师们又带来了福音。…

Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】

通过上一篇《分布式服务跟踪&#xff08;整合logstash&#xff09;》&#xff0c;我们虽然已经能够利用ELK平台提供的收集、存储、搜索等强大功能&#xff0c;对跟踪信息的管理和使用已经变得非常便利。但是&#xff0c;在ELK平台中的数据分析维度缺少对请求链路中各阶段时间延…