前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nacos 中的配置文件如何实现加密传输

Nacos 中的配置文件如何实现加密传输

作者头像
江南一点雨
发布于 2023-01-04 12:32:42
发布于 2023-01-04 12:32:42
2.1K00
代码可运行
举报
文章被收录于专栏:玩转JavaEE玩转JavaEE
运行总次数:0
代码可运行

松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦


小伙伴们知道,Spring Cloud Config 很早就提供了配置文件的加解密功能,并且支持对称加密非对称加密两种不同的模式。Nacos 作为分布式配置中心+服务注册中心的合体,在配置文件加密这块一直差点意思,不过好在,如果你使用的 Nacos 版本大于 2.0.4 这个版本,那么现在也可以通过插件的方式来实现配置文件加密了。

1. 配置文件加密

松哥在之前的微服务视频中讲过,Spring Cloud Config 的对称加密和非对称加密,加密后的文件格式类似下面这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name={cipher}密文
password={cipher}密文

可以看到,在 Spring Cloud Config 中,对配置文件的加密是针对字段一个一个加密的。

而 Nacos 中的加密,则是对整个配置文件的内容进行加密,这点和 Spring Cloud Config 不同。

Nacos 中是通过 SPI 的机制抽象出加密和解密的操作,Nacos 默认提供 AES 对称加密的实现,不过用户也可以自定义加解密的实现方式。

在 Nacos 服务端启动的时候就会加载所有依赖的加解密算法,然后通过发布配置的 dataId 的前缀来进行匹配是否需要加解密和使用的加解密算法。

客户端发布的配置会在客户端通过 filter 完成加解密,也就是配置在传输过程中都是密文的,而控制台发布的配置会在服务端进行处理。

换言之,用了 Nacos 的配置文件加密插件之后,我们在 Nacos 管理页面上配置的配置文件,将会以加密的密文形式存储在数据库中,也会以密文的形式传输到客户端,然后在客户端自动完成解密操作。大致上就是这样一个过程。接下来我们就来看看具体的用法。

2. 实践

首先我们需要下载 nacos 源码进行编译,编译完成之后,需要将之安装到本地 Maven 仓库(因为编译加密插件需要用到 Nacos)。

首先 clone nacos 源码,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/alibaba/nacos.git

下载之后,个人建议用 IDEA 去编译,操作方便一些(因为后续还有其他操作)。

所以我们先用 IDEA 打开项目,确认项目所需依赖均已下载完毕,然后点击 install 按钮,将项目编译安装到本地仓库:

接下来 clone 配置文件加解密的插件,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/nacos-group/nacos-plugin.git

也用 IDEA 打开这个插件项目。这个插件编译要用到我们刚刚编译安装好的 Nacos,但是给的版本号不对,需要我们手动修改下,位置在 nacos-plugin/pom.xml,修改里边 Nacos 的版本号,从 2.2.0-SNAPSHOT 改为 2.2.0-BETA(我刚刚编译安装的是这个版本,大家根据自己的实际情况选择):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<alibaba-nacos.version>2.2.0-BETA</alibaba-nacos.version>

改完之后也执行 install 操作,将所有的插件都安装到本地仓库:

接下来回到一开始的 Nacos 项目中,在 Nacos 项目中引入这个插件的依赖,建议在 config 模块中引入,如下图:

引入内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-aes-encryption-plugin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

加了这个依赖之后,我们的 Nacos 就具备了配置文件加密功能了。

现在我再改一下 console/src/main/resources/application.properties 配置文件,让 Nacos 将数据存入到本地数据库中,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
### Count of DB:
db.num=1
spring.sql.init.platform=mysql
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123

配置完成后,本地提前准备好一个名为 nacos_config 的数据库,并执行 distribution/conf/mysql-schema.sql 脚本文件,将所需的表先创建出来。

接下来,为项目添加启动参数,我们以单机而不是集群的方式来启动 Nacos,如下:

上图大家重点看两个地方,一个是启动类所处的位置,另外一个则是启动参数。

好啦,现在我们就可以像启动 Spring Boot 项目那样启动 Nacos 了。

3. 发布

如果我们想将项目打包发布的话,松哥建议大家先从 GitHub 上下载官方的压缩包,官方的压缩包里边,有一个 target 目录,这个目录下有一个 nacos-server.jar 文件,这个就是 nacos 的启动包了。对于这个官方的压缩包,大家正常配置就行了。

然后,在 IDEA 中,对我们刚刚处理过的 nacos,重新打包,不过记得打包的时候设置一下环境,如下:

设置好环境之后,然后对项目重新进行打包。打包完成后,生成了新的 nacos-server.jar,如下:

用这个 jar 包替换掉官方压缩包中的 jar,然后启动 nacos 即可。

4. 访问

启动成功之后,我们就可以直接访问 nacos 了,用法和平时用法都一样,不同的是,在创建配置文件的时候,文件名有一个固定的前缀 cipher-aes-,有了这个前缀,这个配置文件就会自动加密,否则就不会加密。

例如我现在创建如下配置文件:

创建完成后,我们去数据库中看一下这个配置文件:

可以看到,这个 content 字段已经是一个加密的字符串了(如果没有我们没有加密,则 content 字段保存的就是明文 name=javaboy)。

现在我们创建一个项目,来加载这个加密的配置文件。

创建项目时候,选择 Nacos Configuration,如下:

创建好之后,记得手动加上刚刚的那个加密插件的依赖(解密的时候会用到)。

项目名称记得设置为 cipher-aes-nacos

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 应用名称
spring.application.name=cipher-aes-nacos
# 应用服务 WEB 访问端口
server.port=8080

其他都正常配置即可。

好啦,大功告成!Nacos 配置文件加密就实现啦~


松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江南一点雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[c语言日寄]数据结构:栈
在计算机科学中,数据结构是组织和存储数据的方式,而栈(Stack)是其中一种非常基础且重要的数据结构。它遵循后进先出(Last In First Out,LIFO)的原则,就像一叠盘子,你只能在最上面添加或移除盘子。本文将深入探讨栈的原理、实现方式以及应用场景,帮助读者更好地理解和运用这一数据结构。
siy2333
2025/05/31
630
栈(用C语言实现)
栈:⼀种特殊的线性表,其只允许在固定的⼀端进行插入和删除元素操作。进行数据插入和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。
用户11290648
2024/09/25
3360
栈(用C语言实现)
【算法与数据结构】栈的实现详解
栈的结构: 使用数组实现栈时,维护一个top指针指向栈顶元素的下一个位置。入栈时将元素添加到数组top位置,并将top加1;出栈时从top位置取元素,并将top减1。 使用链表实现栈时,链表的头结点指向栈顶元素。入栈添加新节点到头结点后面,出栈删除头结点。 所以栈具有后进先出的特性,是一种限定只允许在一端插入和删除的线性数据结构。
学习起来吧
2024/03/10
1390
【算法与数据结构】栈的实现详解
【数据结构】栈详解
在前面我们一起了解的数据结构有顺序表和链表,这次来介绍栈。 与顺序表和链表相同的是,栈也是常见的数据结构。而与前面两种不同的是,它在内存中的存储,接下来让我们一起来学习一下。
zxctscl
2024/01/23
7500
【数据结构】栈详解
【数据结构初阶第十九节】八大排序系列(下篇)—[详细动态图解+代码解析]
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。(就是相同的数据排序之后的相对次序保持不变)
云边有个稻草人
2025/03/16
500
【数据结构初阶第十九节】八大排序系列(下篇)—[详细动态图解+代码解析]
《手撕数据结构经典题系列》有效括号问题
有效括号 力扣链接:20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com) 题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例: 提示: 1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成 解题思路: 这里我们使用栈来解决(先入后出的性质 ) 在k题时首先得写个栈出来 读取
用户9645905
2022/11/30
2020
《手撕数据结构经典题系列》有效括号问题
【数据结构初阶】栈接口实现及经典OJ题超详解
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
fhvyxyci
2024/09/24
1460
【数据结构初阶】栈接口实现及经典OJ题超详解
【数据结构】C语言实现顺序栈(附完整运行代码)
通过第二部分对项目功能的介绍,我们已经对顺序栈的功能有了大致的了解,虽然看似需要实现的功能很多,貌似一时间不知该如何下手,但我们可以分步分模块来分析这个项目的流程,最后再将各部分进行整合,所以大家不用担心,跟着我一步一步分析吧!
修修修也
2024/04/01
5850
【数据结构】C语言实现顺序栈(附完整运行代码)
C语言每日一题(35)有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
对编程一片赤诚的小吴
2024/01/23
1200
C语言每日一题(35)有效的括号
【数据结构】栈的顺序表实现
由于栈是由顺序表实现的,因此当空间不够需要扩容,入栈之后top需要+1为了记录下一个入栈位置。
每天都要进步呀
2023/03/28
2930
【数据结构】栈的顺序表实现
【数据结构】栈和队列
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。
用户11290673
2024/09/25
780
【数据结构】栈和队列
DS:顺序栈的实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。
小陈在拼命
2024/02/17
1260
DS:顺序栈的实现
手撕数据结构---栈和队列的概念以及实现
栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
Undoom
2024/09/23
950
手撕数据结构---栈和队列的概念以及实现
【数据结构】栈与队列
1前言:顾名思义,栈与队列是两个东西,栈和队列!对的,栈和队列!!,没错,在念一遍,【栈】     和   【队列】!!!但是本质都是差不多的,只不过底层实现的方式不太一样。
用户11367452
2024/11/21
520
【数据结构】栈与队列
【数据结构】栈与队列OJ题(用队列实现栈)(用栈实现队列)
首先我们要知道的是,我们用队列实现栈,要定义和初始化的是什么,用队列实现栈,实则是用队列的属性实现栈的属性,所以我们在这里要定义队列
用户11367452
2024/11/21
920
【数据结构】栈与队列OJ题(用队列实现栈)(用栈实现队列)
【数据结构】——栈和队列的实现(赋源码)
栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插入和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
用户11286421
2024/09/23
1320
【数据结构】——栈和队列的实现(赋源码)
【初阶数据结构】——限定性线性表:栈 和 队列详解(C描述)
写完这几个函数,大家可能会想,有的函数这么简单,一句代码就搞定了,为什么还要封装成一个函数,有必要嘛?
YIN_尹
2024/01/23
2320
【初阶数据结构】——限定性线性表:栈 和 队列详解(C描述)
【c数据结构】队列详解!(模拟实现、OJ练习实操)
概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
用户11292525
2024/10/12
1470
【c数据结构】队列详解!(模拟实现、OJ练习实操)
数据结构——栈和队列
我们可以看到数据的插入和删除操作都在固定的一端进行,我们把这固定的一端叫做栈顶 ,另外的一端叫做栈底,这也就是栈这个线性表的特殊之处了。
用户11352420
2024/11/07
1550
数据结构——栈和队列
栈和队列详解
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
waves浪游
2024/08/02
960
栈和队列详解
相关推荐
[c语言日寄]数据结构:栈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验