终于把Apollo存储加密这件事搞定了 | 周末福利!

发布网友

我来回答

1个回答

热心网友

作者:尹吉欢 转自:微信公众号“程序员私房菜”

本文节选自《Spring Cloud微服务入门实战与进阶》

敏感配置,如密码等,我们期望进行加密存储,确保其安全性。然而,Apollo框架并未提供数据加密功能。若想实现此功能,有两种方法:一是修改Apollo源码,添加加解密逻辑;二是利用第三方框架进行数据加密。

jasypt-spring-boot是一款基于Spring Boot开发的框架,它可自动解密properties中加密的内容。在Apollo中,我们也可以利用jasypt-spring-boot实现数据的加解密操作。

jasypt-spring-boot的GitHub地址:github.com/ulisesbocchi...

使用jasypt-spring-boot提供的方法对需要加密的配置进行加密,然后将加密内容配置在Apollo中。项目启动时,jasypt-spring-boot会解密Apollo加密的配置,让使用者获取解密后的内容。

创建一个新的Maven项目,并加入Apollo和jasypt的依赖。具体依赖信息如下:

创建一个加密的工具类,用于加密配置。执行main方法后,可以得到如下输出:

input就是hello加密后的内容,将input的值复制存储到Apollo中。存储格式需要遵循一定规则,即需要将加密内容用ENC包起来,这样jasypt才会解密这个值。

使用时可以直接根据名称注入配置,例如:

input的值就是解密后的值,使用者无需关心解密逻辑,jasypt框架在内部处理好了。

jasypt整合Apollo也存在一些不足之处。目前,我只发现了以下两个问题:

上述两个问题与jasypt实现方式有关,意味着这种加密方式可能仅适用于数据库密码等场景,启动时可以解密,且仅使用一次。对于需要加密的核心业务配置,jasypt无法支持实时更新。下章节我将讲解如何修改Apollo源码来解决这两个问题。

扩展Apollo支持存储加解密

前文介绍了如何使用jasypt为Apollo中的配置进行加解密操作,基本需求可实现。但仍存在一些不足之处。

jasypt仅在启动时解密带有ENC(xx)格式的配置,当配置发生修改时无法更新。由于Apollo框架本身不具备对配置加解密的功能,若想实现加解密并支持动态更新,就需要修改Apollo源码来满足需求。

修改源码需要重新打包。这里介绍一种简单实现方法:创建一个与Apollo框架中相同类名的类进行覆盖,这样无需替换已使用的客户端。

若配置中心存储的内容是加密的,意味着Apollo客户端从配置中心拉取下来的配置也是加密的。我们需要在配置拉取下来后对其进行解密,然后再执行后续流程,如绑定到Spring中。在业务点进行切入后,配置中心加密的内容可自动转换为解密后的明文,对使用者透明。

通过分析Apollo源码,我找到了一个最合适的切入点来完成这项任务,即com.ctrip.framework.apollo.internals.DefaultConfig类。DefaultConfig是Config接口的实现类,配置的初始化和获取都会经过DefaultConfig的处理。

在DefaultConfig内部有一个更新配置的方法updateConfig,可在该方法中对加密数据进行解密处理:

这里使用AES进行解密,意味着配置中心的加密内容也需要使用相同的加密算法进行加密。至于格式,仍使用ENC(xx)格式来标识加密配置内容。解密后将明文内容重新赋值到Properties中,其他流程保持不变。

创建一个加密测试类,加密配置内容,并将其复制存储到Apollo中。输出内容如下:

Ke4LIPGOp3jCwbIHtmhmBA==

存储到Apollo中时,需要用ENC将加密内容包起来,如下:

test.input = ENC(Ke4LIPGOp3jCwbIHtmhmBA==)

使用之前的代码进行测试,Config获取和Spring注入的方式可以成功获取到解密后的数据,并且在配置中心修改后也能实时推送到客户端并成功解密。

本文摘自于《Spring Cloud微服务入门实战与进阶》一书。这是朋友写的一本新书,豆瓣评分8.2。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com