上一篇:微服务实战|集中配置组件Config规避敏感信息泄露
上一篇文章中,我们介绍了使用集中配置中心组件Config实现了敏感信息的集中管理。但是,在配置文件中,配置信息依然使用的是明文,今天我们将介绍一下使用Config实现敏感信息的安全管理、配置文件的加密解密等机制。
不可逆加密就是大家熟知的在 Spring Security 或者 Shiro 这一类安全管理框架中我们对密码加密经常采取的方案。这种加密算法的特点就是不可逆,即理论上无法使用加密后的密文推算出明文,常见的算法如 MD5 消息摘要算法以及 SHA 安全散列算法等。
可逆算法顾名思义,这种算法是可以根据密文推断出明文的,在我们的配置文件,我们要存放加密的密文,但是使用的时候还是需要解密后明文才能使用,所以需要使用可逆算法进行加密,可逆算法又分为两大类:
对称加密是指加密的密钥和解密的密钥一致,例如 A 和 B 之间要通信,为了防止别人偷听,两个人提前约定好一个密钥。每次发消息时, A 使用这个密钥对要发送的消息进行加密,B 收到消息后则使用相同的密钥对消息进行解密。这是对称加密,常见的算法有 DES、3DES、AES 等。
非对称加密就是加密的密钥和解密的密钥不是同一个,加密的密钥叫做公钥,可以公开告诉任何人,解密的密钥叫做私钥,只有自己知道。非对称加密不仅可以用来做加密,也可以用来做签名,使用场景还是非常多的,特别是在一些一对多的通信场景下,常见的加密算法是 RSA 。
可逆算法中的对称加密和非对称加密在 Spring Cloud Config 中都得到支持,下面我们就开始实战。
Java 中提供了一套用于实现加密、密钥生成等功能的包 JCE(Java Cryptography Extension),这些包提供了对称、非对称、块和流密码的加密支持,但是默认的 JCE 是一个有限长度的 JCE ,我们需要到 Oracle 官网去下载一个不限长度的 JCE :JCE加密包官网下载
下载完成后,将压缩包解压后的文件拷贝到 JDK 的安装目录下: %JAVA_HOME%\jre\lib\security
继续修改我们的config-server项目,在resource下创建一个bootstrap.yml文件,内容如下:
encrypt:
key: 123456
因为使用的是对称加密算法,将加密和解密的秘钥设置为123456。
启动config-server项目,验证一下加密解密是否正常:
访问http://localhost:8005/encrypt/status,返回ok
再来访问http://localhost:8081/encrypt 加密接口:
再来访问http://localhost:8081/encrypt 解密接口:
一切正常,能够正常加密和解密。
加密和解密功能正常之后,就要修改我们的配置文件内容了,将之前使用明文的地方,改成我们的密文。
继续修改我们的config-server项目,在repo文件夹下,修改客户端的配置文件configclient-dev.yml,增加如下内容:
app:
key: '{cipher}5ab3ce1502c40c276074f400aee0be0f6279d6a85bb9d8d315a78c7a91603dde58d4512a6bc9f6492a8eddd34dbeeac0'
注意密文前面增加{cipher},这样才能正常解密。
然后修改客户端config-client项目,增加一个访问接口:
/**
* @Author:公众号:程序员965
* @create 2022-07-17
**/
@RestController
public class ConfigController {
@Value("${app.key}")
String appKey;
@GetMapping("/hello")
public String hello() {
return appKey;
}
}
最后,再次重启registry项目以及config-server,config-client两个服务,访问client端的hello接口:http://localhost:8007/hello,正常返回了加密后的明文: