国外网站建设软件,网站开发的工资一般是多少,博客网站开发流程,餐饮网站源码大家好#xff0c;我是风筝#xff0c;微信搜「古时的风筝」#xff0c;更多干货
当项目中用了 Nacos 做配置中心#xff0c;是不是所有的配置都放到里面呢#xff0c;大部分时候为了省事和统一#xff0c;系统所有的配置都直接放在里面了#xff0c;有时候#xff0c…大家好我是风筝微信搜「古时的风筝」更多干货
当项目中用了 Nacos 做配置中心是不是所有的配置都放到里面呢大部分时候为了省事和统一系统所有的配置都直接放在里面了有时候会包括一些账号、密码、秘钥等信息。
这时候你们的项目是怎么处理的呢?
一种方式不管它反正 Nacos 有密码如果 Nacos 都被攻破了那也没办法。
还有一种方式这些涉及到密码、秘钥的信息放到本地环境变量中这种方式虽然也还算方便但是管理起来就不是很统一了。
那有没有什么一举两得的方式呢
Nacos2.0本身的插件功能
Nacos 本身提供了一种加密实现是基于SPI的插件机制实现的。
要使用插件需要Nacos版本是2.x版本如果你正在使用1.x版本需要进行升级。
引入插件包。
dependencygroupIdcom.alibaba.nacos/groupIdartifactIdnacos-aes-encryption-plugin/artifactIdversion${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 开发的包
dependencygroupIdcom.github.ulisesbocchio/groupIdartifactIdjasypt-spring-boot-starter/artifactIdversion3.0.5/version
/dependency2、在配置文件中进行相关配置
jasypt:encryptor:password: helloalgorithm: PBEWithMD5AndDESalgorithm是加密算法官方默认的加密算法是 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(GT2vTn1SdeFu90xH/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 事务隔离级别