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: hello
    algorithm: 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 事务隔离级别

Nacos配置中心提供了配置文件加密功能,可以对配置文件中的敏感信息进行加密处理。这样可以保护敏感信息,如数据库连接方式或第三方存储系统的相关信息。在Nacos的2.1版本中,新增了配置文件加密功能,无需自己实现,可以轻松实现配置内容的AES加密。\[1\] 要使用Nacos配置中心加密功能,可以在启动配置类bootstrap.yml中添加相关信息。可以通过自定义加解密类来实现加解密操作,也可以使用jasypt默认的StringEncryptor进行加解密。在配置文件中添加jasypt的相关配置,包括加解密类的bean和盐值。\[2\] 配置文件会存储在Nacos的config_info表中,配置内容存储在content字段中。如果配置加密,content字段中存储的是密文,但在Nacos客户端展示配置时会以明文形式显示。这样可以保证配置的安全性,同时方便查看配置内容。\[3\] #### 引用[.reference_title] - *1* *3* [【Nacos配置中心】对配置文件内容进行加密](https://blog.csdn.net/weixin_43888891/article/details/126783468)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [nacos配置文件中敏感信息加密](https://blog.csdn.net/goldenminers/article/details/120488006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值