Nacos 配置加密功能也太鸡肋了吧,有种更好的方式

大家好,我是风筝,微信搜「古时的风筝」,更多干货

当项目中用了 Nacos 做配置中心,是不是所有的配置都放到里面呢,大部分时候为了省事和统一,系统所有的配置都直接放在里面了,有时候,会包括一些账号、密码、秘钥等信息。

这时候你们的项目是怎么处理的呢?

一种方式,不管它,反正 Nacos 有密码,如果 Nacos 都被攻破了,那也没办法。

还有一种方式,这些涉及到密码、秘钥的信息放到本地环境变量中,这种方式虽然也还算方便,但是管理起来就不是很统一了。

那有没有什么一举两得的方式呢?

Nacos2.0本身的插件功能

Nacos 本身提供了一种加密实现,是基于SPI的插件机制实现的。

要使用插件,需要Nacos版本是2.x版本,如果你正在使用1.x版本,需要进行升级。

引入插件包。

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-aes-encryption-plugin</artifactId><version>${nacos-aes-encryption-plugin.version}</version>
</dependency>

之后如果想对配置加密,需要创建名称为 cipher-[加密算法名称]-dataId这种规则的配置文件,例如cipher-aes-application-dev.yml

之后不管你在配置中写上什么内容,都会被加密。

例如:

password: 123456

那在程序中读出来的都是被加密过的,需要你调用插件提供的解密方法解密,或者自定义加解密方法。

但实话说这种方式有点粗暴了。不加密则已,一加密那就是整个配置文件啊,这好像也不太符合只有部分字段需要加密的场景。

而且你还必须得升级到2.x的版本才行,都做成插件了,还要区分版本。

而且官方文档相当敷衍了,实在不像是诚意之作啊。

我选择放弃这种方式。

我选择 Jasypt

Jasypt 其实是一个专门用于加解密的库,对于像 Nacos 配置文件、本地配置文件等配置信息的加解密就是一个顺手的事儿。

加解密就不用多说了,有很多的开源包,甚至你自己写一个工具类都是轻而易举的事儿。

如果我们使用 Spring Boot 的话,一般读取配置的时候用下面这种方式,不管是本地配置文件、环境变量或者Nacos都可以通用。

@Value("${aestest.appKey}")
private String appKey;

如果改成加密的配置后,上面的 appKey 读出来的内容可能就变成了0cxddfjjgglllsff000s这种一串看不懂的内容了。当然了,我们可以在使用这个变量的地方调用解密方法进行解密,但是这样一来,就变得很麻烦了。

开始我还打算自己写一个来着,后来发现 jasypt-spring-boot-starter正好完美的实现了,直接用它就好了。

1、首先引入jasypt专门为 Spring Boot 开发的包

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>

2、在配置文件中进行相关配置

jasypt:encryptor:password: helloalgorithm: PBEWithMD5AndDES

algorithm是加密算法,官方默认的加密算法是 PBEWITHHMACSHA512ANDAES_256,但是如果你用的是 JDK1.8,还用不了这个算法,JDK9以上才支持,所以可以把这个算法改成PBEWithMD5AndDES

password是加解密的时候用到的密码,这个配置是不建议放到Nacos的,可以放到环境变量中,这样一来,就只有这一个参数放到环境变量了。

3、生成加密字符串

Jasypt 默认用 Enc(内容)这样的格式来表示这是加密的配置,当然你可以通过配置来修改前缀和后缀,比如改成 JASYPT[内容]这种形式,其中内容部分是加密后的。

加密串可以这样生成。

引入加密类

@Autowired
private StringEncryptor encryptor;

生成加密内容

@GetMapping("/encrypt")
public String encrypt(String content) {return "ENC(" + encryptor.encrypt(content) + ")";
}

4、最后将生成的加密串保存到 Nacos 或本地配置中,例如下面这样

aestest:appKey: ENC(GT2vTn1+SdeFu90xH/vgw3uYTNyV5PGp)

5、直接使用@Value注解获取就行,和不加密的用法一模一样

@Value("${aestest.appKey}")
private String appKey;
原理

加密的原理没啥好说的,上面用的PBEWithMD5AndDES就是DES加密算法。

@Value注解直接拿到解密后的值,其实是实现了BeanFactoryPostProcessor接口,相当于利用 Spring Boot 的加载机制做了一个filter,在filter中查找 @Value注解,并且内容是以 Jasypt 指定的前后缀的配置项(例如ENC()),将找到的内容进行解密,再赋值解密后的值。

更详细的用法可在官方GitHub仓库中查看,地址:https://github.com/ulisesbocchio/jasypt-spring-boot

不如点个赞
在这里插入图片描述

推荐阅读

➿ 剑走偏锋,无头浏览器是什么神奇的家伙

➿ 新项目决定用 JDK 17了

➿ 5000字,10张图,完全掌握 MySQL 事务隔离级别

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

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

相关文章

什么是自动化测试框架?常用的自动化测试框架有哪些?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

Redis相关知识

yum安装redis 使用以下命令&#xff1a;直接将redis安装到Linux服务器&#xff08;Xshell&#xff09;中 yum -y install redis 启动redis 使用以下命令&#xff0c;以后台运行方式启动redis redis-server /etc/redis.conf & 操作redis 使用以下命令启动redis客户端 redis-…

RFID在新能源工厂大放异彩

RFID在新能源工厂大放异彩 我国在十四五规划中提出了建设绿色低碳发展的目标&#xff0c;新能源产业成为了国家发展的重点领域之一&#xff0c;开始大力支持各种新能源厂商发展。各个厂商之间不仅比产品、比技术。也比生产想要降本增效&#xff0c;为了实现这一目标&#xff0…

MBD Introduction

介绍 MATLAB是MathWorks公司的商业数学软件&#xff0c;应用于科学计算、可视化以及交互式程序设计等高科技计算环境。Simulink是MATLAB中的一种可视化仿真工具。 Simulink是一个模块图环境&#xff0c;用于多域仿真以及基于模型的设计。它支持系统设计、仿真、自动代码生成以…

Spring基于xml半注解开发

目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置&#xff0c;使用Component注解替代<bean>标签中的id以及class属性&#xff0c;而对…

算法Day26 数位统计

数位统计 Description 给你一个整数n&#xff0c;统计并返回各位数字都不同的数字x的个数&#xff0c;其中0 ≤ x < 10^n。 Input 输入整数n 0≤n≤13 Output 输出整数个数 Sample 代码 import java.util.Scanner;public class Main {public static void main(String[] ar…

Epoll服务器(ET工作模式)

目录 Epoll ET服务器设计思路Connection类TcpServer类 回调函数Accepter函数Recever函数Sender函数Excepter函数 事件处理套接字相关接口封装运行Epoll服务器 Epoll ET服务器 设计思路 在epoll ET服务器中&#xff0c;我们需要处理如下几种事件&#xff1a; 读事件&#xff…

基于javeweb实现的图书借阅管理系统

一、系统架构 前端&#xff1a;jsp | js | css | jquery 后端&#xff1a;servlet | jdbc 环境&#xff1a;jdk1.7 | mysql | tocmat 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 图书管理 04. 读者管理 05. 图书分类管理 06. 图书借阅信息 07. 图书归还信…

NLP项目实战01--电影评论分类

介绍&#xff1a; 欢迎来到本篇文章&#xff01;在这里&#xff0c;我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言&#xff0c;我们将关注情感分析任务&#xff0c;即通过分析电影评论的情感来判断评论是正面的、负面的。 展示&#xff1a; 训练展示如下…

图像叠加中文字体

目录 1) 前言2) freetype下载3) Demo3.1) 下载3.2) 编译3.3) 运行3.4) 结果3.5) 更详细的使用见目录中说明 4) 积少成多 1) 前言 最近在做图片、视频叠加文字&#xff0c;要求支持中文&#xff0c;基本原理是将图片或视频解码后叠加文字&#xff0c;之后做图片或视频编码即可。…

ASP.NET Core概述-微软已经收购了mono,为什么还搞.NET Core呢

一、.NET Core概述 1、相关历程 .NET在设计之初也是考虑像Java一样跨平台&#xff0c;.NET Framework是在Windows下运行的&#xff0c;大部分类是可以兼容移植到Linux下&#xff0c;但是没有人做这个工作。 2001年米格尔为Gnome寻找桌面开发技术&#xff0c;在研究了微软的.…

数据库版本管理框架-Flyway(从入门到精通)

一、flyway简介 Flyway是一个简单开源数据库版本控制器&#xff08;约定大于配置&#xff09;&#xff0c;主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL&#xff08;PL/SQL、T-SQL&#xff09;方式和Java方式&#xff0c;支持命令行客户端等&am…

TCP对数据的拆分

应用程序的数据一般都比较大&#xff0c;因此TCP会按照网络包的大小对数据进行拆分。 当发送缓冲区中的数据超过MSS的长度&#xff0c;数据会被以MSS长度为单位进行拆分&#xff0c;拆分出来的数据块被放进单独的网路包中。 根据发送缓冲区中的数据拆分情况&#xff0c;当判断…

JWT介绍及演示

JWT 介绍 cookie(放在浏览器) cookie 是一个非常具体的东西&#xff0c;指的就是浏览器里面能永久存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。 cookie由服务器生成&#xff0c;发送给浏览器&#xff0c;浏览器把cookie以kv形式保存到某个目录下的文本…

JavaScript 金额元转化为万

function dealNum(price){if (price 0) {return 0元}const BASE 10000const decimal 0const SIZES ["", "万", "亿", "万亿"];let i undefined;let str "";if (price) {if ((price > 0 && price < BASE…

通过命令行输入参数控制激励

1)在命令行的仿真参数&#xff08;SIM_OPT&#xff09;加上&#xff1a;“var_a100 var_b99” 2)在环境中调用&#xff1a; $test$plusargs("var_a")&#xff1b;如果命令行存在这个字符&#xff0c;返回1&#xff0c;否则返回0&#xff1b; $value$plusargs(&qu…

蓝牙物联网对接技术难点有哪些?

#物联网# 蓝牙物联网对接技术难点主要包括以下几个方面&#xff1a; 1、设备兼容性&#xff1a;蓝牙技术有多种版本和规格&#xff0c;如蓝牙4.0、蓝牙5.0等&#xff0c;不同版本之间的兼容性可能存在问题。同时&#xff0c;不同厂商生产的蓝牙设备也可能存在兼容性问题。 2、…

0-1背包问题

二维版: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {static int N 1010;static int[][] dp new int[N][N]; //dp[i][j] 只选前i件物品,体积 < j的最优解static int[] w new int[N]; //存储价…

字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现

文章目录 &#x1f680;前言&#x1f680;库函数strlen✈️strlen的模拟实现 &#x1f680;库函数strcpy✈️strcpy的模拟实现 &#x1f680;strcmp✈️strcmp的模拟实现 &#x1f680;strstr✈️strstr的模拟实现 &#x1f680;strcat✈️strcat的模拟实现 &#x1f680;前言 …

ReactJS和VueJS的简介以及它们之间的区别

本文主要介绍ReactJS和VueJS的简介以及它们之间的区别。 目录 ReactJS简介ReactJS的优缺点ReactJS的应用场景VueJS简介VueJS的优缺点VueJS的应用场景ReactJS和VueJS的区别 ReactJS简介 ReactJS是一个由Facebook开发的基于JavaScript的前端框架。它是一个用于构建用户界面的库&…