大众号「古时的风筝」,专注于后端技能,尤其是 Java 及周边生态。
个人博客:www.moonkite.cn
大家好,我是风筝
当项目中用了 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库房中检查,地址:github.com/ulisesbocch…
推荐阅览
➿ 剑走偏锋,无头浏览器是什么神奇的家伙
➿ 什么是向量数据库
➿ 《轻解计算机网络》系列离线版 PDF 终于来了
➿ JDK21引进协程,再也不用为并发而头疼了