Spring Cloud之 Config 中 配置文件的加密与解密

Spring Cloud Config 中配置文件的加密与解密

上篇文章和大家聊了 Spring Cloud Config 分布式配置中心的基本用法,相信大家对 Spring Cloud Config 已经有了一个基本的认识。可能有读者也发现问题了,原本在非分布式环境下,一些由运维工程师掌握的敏感信息现在不得不写在配置文件中了,这样网传的程序员删库跑路的段子可能就成真了!但是在微服务中,我们又不太可能让运维工程师手动去维护这些信息,因为工作量太大了,那么一个好的办法,就是对这些配置信息进行加密,这也是我们本文要说的重点。

常见加密方法

说到加密,需要先和大家来捋一捋一些常见的加密策略,首先,从整体上来说,加密分为两大类:

  • 不可逆加密
  • 可逆加密

  • 不可逆加密就是大家熟知的在 Spring Security 或者 Shiro 这一类安全管理框架中我们对密码加密经常采取的方案。这种加密算法的特点就是不可逆,即理论上无法使用加密后的密文推算出明文,常见的算法如 MD5 消息摘要算法以及 SHA 安全散列算法, SHA 又分为不同版本,这种不可逆加密相信大家在密码加密中经常见到。

    可逆算法看名字就知道,这种算法是可以根据密文推断出明文的,可逆算法又分为两大类:

  • 对称加密
  • 非对称加密
  • 对称加密是指加密的密钥和解密的密钥一致,例如 A 和 B 之间要通信,为了防止别人偷听,两个人提前约定好一个密钥。每次发消息时, A 使用这个密钥对要发送的消息进行加密,B 收到消息后则使用相同的密钥对消息进行解密。这是对称加密,常见的算法有 DES、3DES、AES 等。

    对称加密在一些场景下并不适用,特别是在一些一对多的通信场景下,于是又有了非对称加密,非对称加密就是加密的密钥和解密的密钥不是同一个,加密的密钥叫做公钥,这个可以公开告诉任何人,解密的密钥叫做私钥,只有自己知道。非对称加密不仅可以用来做加密,也可以用来做签名,使用场景还是非常多的,常见的加密算法是 RSA 。

    配置文件加密肯定是可逆加密,不然给我一个加密后的字符串,我拿着也没用,还是没法使用。可逆算法中的对称加密和非对称加密在 Spring Cloud Config 中都得到支持,下面我们就分别来看。

    对称加密

    Java 中提供了一套用于实现加密、密钥生成等功能的包 JCE(Java Cryptography Extension),这些包提供了对称、非对称、块和流密码的加密支持,但是默认的 JCE 是一个有限长度的 JCE ,我们需要到 Oracle 官网去下载一个不限长度的 JCE :
    不限长度JCE下载地址

    下载完成后,将下载文件解压,解压后的文件包含如下三个文件:
    在这里插入图片描述
    将 local_policy.jar 和 US_export_policy.jar 两个文件拷贝到 JDK 的安装目录下,具体位置是 %JAVA_HOME%\jre\lib\security ,如果该目录下有同名文件,则直接覆盖即可。

    下面我们开始创建工程实现。首先我们创建一个父工程叫cloud-config-salt的普通maven工程,然后再创建一个cloudConfig作为子工程,再创建一个cloudRepo作为子工程。然后我们在cloudConfig的目录下创建两个SpringBoot工程,分别是config_client和config_server,然后再cloudRepo的目录下创建一个client1的文件夹用来放配置文件。

    这些都准备好了后,我们在cloud_config的resource下创建一个bootstrap.yml
    并且增加如下配置:

    encrypt:
      key: 666666
    

    这里我们配置了我们的密钥为666666, 然后我们去访问下面这个接口来检查我们的配置是否正确http://localhost:8081/encrypt/status
    在这里插入图片描述
    可以看到访问这个接口返回的是ok,说明是没有问题的。

    我们使用post方法来访问http://localhost:8081/encrypt 加密接口:
    在这里插入图片描述
    这里我们对普通对文本内容:love coding进行了加密,加密返回后内容如下:
    在这里插入图片描述
    拿到加密后的字符串后,我们肯定要进行解密,那么我们访问解密接口http://127.0.0.1:8081/decrypt
    在这里插入图片描述
    传入已经加密的字符串,然后得到解密的字符串:
    在这里插入图片描述
    这样就完成了解密。
    当然这只是在本地仓库中使用,那么我修改v本地仓库中的config-server-dev.yml配置文件。将加密的字符串拷贝进来如下:

    love: '{cipher}AQBBRuFnazIXBRpoHaaSbGe4IfnNAVUfB06odDRFf9WAzGlaZ0inHvr6rJTjZ1mIB2IihSBV3C2dn4YQOr8NSHOh7Tknr2MNvHYiwaMfDWk15Y0nbzd1Ndl77Bh8py144WKMCSmzaMVbswiLWn5WrwZ23Aje6a9G+MtjOXQ2cjIJKdf/0nXHzloaaT2Y3SsWOTF65N3v94C39RueCGaHz44QtAABA6AMJSqiW5KRmGaY162xlcLLxifbdTQn9vNeztAxEWsZY/eSCx1pgZIC0NkA2ekDlOfVwHrqvkWw41DMwHXHRLpPXVNoiwieMcVRKdPufco6AHn2pbDRXGYcOwZ64tOviUoKA9f0edWjIYJ8UpNZ+uVAB6EfpiFjQBV85zo='
    

    这就是config-server-dev.yml中的内容,注意{cipher} 不要忘记了。只有加上它我们才能解密。

    这样修改完成后,我们需要同步到github仓库,这里步骤就不阐述了。

    然后我们创建一个config_client项目,然后作为子项目,并且加入config client的依赖:

    <dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-config</artifactId>
    		</dependency>
    

    加入依赖后,我们创建一个HelloController如下:

    @RestController
    public class HelloController {
        @Value("${love}")
        String love;
    
        @GetMapping("/hello")
        public String hello() {
            return love;
        }
    }
    

    其中的love 就是我们从远端仓库读取的配置名称。
    然后我们访问http://localhost:8002/hello 结果如下:
    在这里插入图片描述
    我们的远端解密就完成了。

    非对称解密

    当然我们也可以使用非对称加密的方式来对配置文件进行加密,非对称加密要求我们先有一个密钥,密钥的生成我们可以使用 JDK 中自带的 keytool。keytool 是一个 Java 自带的数字证书管理工具 ,keytool 将密钥(key)和证书 (certificates) 存在一个称为 keystore 的文件中。具体操作步骤如下:
    首先打开命令行窗口,输入如下命令:

    keytool -genkeypair -alias config-server -keyalg RSA -keystore /Users/zhoubiao/Desktop/config-server.keystore
    

    上面参数的解释如下:

  • -genkeypair 表示生成密钥对
  • -alias 表示 keystore 关联的别名
  • -keyalg 表示指定密钥生成的算法
  • -keystore 指定密钥库的位置和名称
  • 执行过程中,密钥库口令需要牢记,这个我们在后面还会用到。其它的信息可以输入也可以直接回车表示 Unknown ,自己做练习无所谓,实际开发中还是建议如实填写。好了,这个命令执行完成后,在 /Users/zhoubiao/Desktop路径下就会生成一个名为 config-server.keystore 的文件,将这个文件直接拷贝到 config_server 项目的 classpath 下,如下:
    在这里插入图片描述

    然后在 config_server 的 bootstrap.yml 文件中,添加如下配置(注意注释掉对称加密时的那一行配置:

    encrypt:
      key-store:
        location: config-server.keystore
        alias: config-server
        password: 123456
        secret: 123456
    

    配置完成后,重新启动 config_server 。启动成功后,加密解密的链接地址和对称加密都是一样的,因此,我们可以继续 http://localhost:8081/decrypt 对文本进行加密:
    在这里插入图片描述
    加密后的字符串:
    在这里插入图片描述
    然后访问 http://localhost:8081/decrypt 进行解密:
    在这里插入图片描述
    解密后的字符串
    在这里插入图片描述
    那么我们需要修改本地的config-server-dev.yml配置文件新增一个加密的配置如下:

    name: '{cipher}AQA/T13gboCx9ai1toFG+xUfTUHsJ1pU3VU78l1cQebdUwPcLuN+X8KWi0SZPe8bIkFdjYS0uYC/q8WFlLCX5oWZIpoo7tj08cziFxlyBZSGgL9U8me+PHEg4GM34DL4wSpSvTTWKx6S9Ebtzhq7IUaMZZ6HQNrg9TfTq7jx6aYou1DOpELUhdOphKfYl45rCw7NRUZbLU5eevIXMC3QW6ImppqjwMtyVQ/2hBVYsy8TAIG4tKfCztwOJ/HnnTNhz8yHkWQUkGenWyQJ39c0UwXqREm57x7ZFsfa/AEPmd5blV9sRcllfLRu1IaruYI+PcgvS7le+V8lQPBPjJ2TA/qSacKkKhBTelbi8MCqNAmehPjwaBYdfEyrPZQuY+XHTAY='
    

    然后上传到github仓库。然后我们修改config_client中的HelloController

    @RestController
    public class HelloController {
        @Value("${love}")
        String love;
        
        @Value("${name}")
        String name;
    
        @GetMapping("/hello")
        public String hello() {
            return love;
        }
        
        @GetMapping("/name")
        public String name() {
            return name;
        }
    }
    

    其中的name就是我们新增加的。然后我们重启config_server然后访问

    http://localhost:8002/name
    

    结果如下:
    在这里插入图片描述
    这样就完成了解密。

    安全管理

    目前的 config_server 存在很大的安全隐患,因为所有的数据都可以不经过 config_client 直接访问。出于数据安全考虑,我们要给 config_server 中的接口加密。在 Spring Boot 项目中,项目加密方案当然首选 Spring Security ,使用 Spring Security 也很简单,只需要在 config_server 项目中添加如下依赖即可:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    

    添加完成之后,重启 config_server 项目,然后浏览器中输入 http://localhost:8081/config-server/dev/master

    在这里插入图片描述
    可以看到,此时接口已经被保护起来了,必须要登录之后才能访问,我们输入用户名jishu,密码123456 就可以访问我们远端的配置文件了。

    总结

    本篇主要教大家配置中心的加密和解密,以及使用SpringSecurity来对配置中心进行安全保护。下一节将会教大家如何做到动态刷新、重试。

    源码地址

    github

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring boot+spring cloud视频教学下载全套。( ├1 公开课.avi ├10 4.6 Ribbon-3使用配置文件自定义Ribbon Client.avi ├11 4.7 Ribbon-4 Ribbon脱离Eureka使用.avi ├12 4.8 Feign-1 Feign的简介及基础使用.avi ├13 4.9 Feign-2覆写Feign的默认配置.avi ├14 4.10 Fegion-3覆写Fegion的默认配置及Fegion的日志.avi ├15 4.11 Fegion-4解决Fegion第一次请求timeout的问题.avi ├16 4.12 Eureka深入理解.avi ├17 4.13 Eureka常用配置详解.avi ├18 4.14 Eurek Ribbon Feign常见问题及解决.avi ├19 5.1超时机制,断路器模式简介.avi ├2 1.1 微服务架构概述.avi ├20 5.2 Hystrix简介及简单代码示例.avi ├20 5.2Hystrix简介及简单代码事例.avi ├21 Hystrix Health Indicator及Metrics Stream.avi ├22 5.4 Hystrix Health Indicator及Metrics Stream支持.avi ├23 5.5 Fegion的Hystrix支持.avi ├24 5.6如何禁用单个FegionClient的Hystrix的支持.avi ├25 5.7 Feign使用fallbackFactory属性打印fallback异常.avi ├26 5.8 Hystrix Dashboard的使用与常见问题总结.avi ├27 5.9 Turbine-上.avi ├28 5.9 Turbine-下.avi ├29 6.1 API Gateway简介.avi ├3.开始使用Spring Cloud实战微服务.avi ├30 6.2 Zuul简介及代码示例.avi ├31 6.3 Zuul指定path+serviceid.avi ├32 6.4 Zuul指定Path+url以及指定可用的服务节点时如何负载均衡.avi ├33 6.5 Zuul使用正则表达式指定路由规则.avi ├34 6.6 Zuul路由的strip-prefix与order.avi ├35 6.7 Zuul的各种姿势.avi ├36 6.8通过Zuul上传文件,禁用Zuul的Filters.avi ├37 6.9 Zuul的回退.avi ├38 6.10 使用Sidecar支持异构平台的微服务.avi ├39 6.10 Sidecar补充.avi ├4 服务提供者与服务消费者.avi ├4 服务提供者与服务消费者new.avi ├40 6.11-1 Zuul过滤器.avi ├41 6.11-2禁用Zuul的过滤器.avi ├42 7.1 Spring Cloud Config简介.avi ├43 7.2 编写Config Server.avi ├44 7.3 编写Config Client.avi ├45 7.4 Git仓库配置详解.avi ├46 7.5配置属性加解密之对称加密.avi ├47 7.6配置属性加解密之非对称加密.avi ├48 7.7 Spring Cloud Config与Eureka.avi ├49 7.8 Spring Cloud Config 与Eureka配合使用.avi ├5 4.1服务发现与服务注册.avi ├50 7.9 Spring Cloud Config配置属性刷新之手动刷新.avi ├51 7.10 Spring Cloud Config配置属性刷新之自动刷新.avi ├52 7.11 Spring Cloud Config配置属性刷新之自动刷新补充.avi ├53 7.12 Config Server的高可用.avi ├6 4.2Eureka简介与Eureka Server上.avi ├7 4.3将微服务注册到Eureka Server上.avi ├8 4.4 Ribbon-1 Ribbon的基本使用.avi ├9 4.5 Ribbon-2通过代码自定义配置ribbon.avi )
### 回答1: Spring Cloud Config配置心有以下功能: 1. 集管理应用程序的配置信息 2. 支持多环境配置 3. 支持加密/解密配置信息 4. 支持客户端自动更新配置信息 5. 支持版本管理 6. 支持配置信息的动态刷新 ### 回答2: Spring Cloud Config配置心是一个可以集管理、动态更新分布式系统的配置的工具。它具有以下功能: 1. 集管理:Spring Cloud Config可以将分布式系统的配置集存储在一个地方,使得配置信息更加可控和可维护。开发人员可以通过配置服务器统一管理各个环境(如开发、测试、生产)的配置文件,减少配置文件的传统散落问题。 2. 动态更新:在分布式系统,如果某些配置信息发生变化,传统方式需要重新部署应用程序才能使变化生效。而使用Spring Cloud Config可以实现动态更新,即可以在不重新部署应用的情况下,及时将新的配置信息更新到应用程序,减少了重新部署对系统的影响和停机时间。 3. 版本管理:Spring Cloud Config允许配置文件进行版本管理,每次更新配置文件都会生成一个新的版本,方便进行配置的历史版本查看和回滚操作。这样可以有效地避免因为配置错误而导致的系统故障,并提高系统的可靠性和稳定性。 4. 分布式支持:Spring Cloud Config支持将配置文件分布式地存储在多个配置服务器,可以根据需求进行水平扩展和负载均衡,确保系统可扩展性和高可用性。 5. 安全性:Spring Cloud Config提供了对配置文件的安全保护机制,开发人员可以通过对配置文件进行加密解密操作,确保配置文件的安全性,防止敏感信息泄露。 总的来说,Spring Cloud Config配置心提供了集管理、动态更新、版本管理、分布式支持和安全性等功能,帮助开发人员更加方便地管理和维护分布式系统的配置信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值