天天看点

【Spring Cloud总结】35.配置属性加解密之对称加密

接上篇《34.Git仓库配置详解》  Spring Cloud版本为Finchley.SR2版

上两篇我们]讲解了有关Spring Cloud Config的私有远端仓库的一些配置,以及对不同的配置进行了测试。本篇我们继续来讲解Spring Cloud Config的加密和解密操作。

本部分官方文档:https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html#_encryption_and_decryption_2

注:好像Finchley.SR2的文档已经挂了,最新的是Finchley.SR4的文档。

Spring Cloud Config的加密和解密是针对配置属性的加解密。

我们回顾一下之前的配置文件,例如simple仓库的application.yml文件内容:

【Spring Cloud总结】35.配置属性加解密之对称加密

我们可以看到配置文件的内容通过Config服务端传过来也是“type: simple”的一个明文,若该配置文件存储着比较敏感的信息,例如数据库的账号密码,在仓库或者传输过程中,就很容易泄露。

所以我们很有必要在Config Server端对配置文件的内容进行一个加解,在Client进行解密密的操作。

一般加密分配两种方式,对称加密和非对称加密。

对称加密过程和解密过程使用的同一个密钥,加密过程相当于用原文+密钥可以传输出密文,同时解密过程用密文-密钥可以推导出原文。但非对称加密采用了两个密钥,一般使用公钥进行加密,使用私钥进行解密。

本篇我们主要针对对称加密进行讲解,Config Server端开启对称加密功能需要以下几步:

1、下载安装JCE

2、配置对称加密的密钥

3、验证加密功能

一、下载安装JCE

在Spring Cloud的官方文档中关于Config的加解密是这么叙述的:

要使用加密和解密功能,您需要在JVM中安装全强度JCE(默认情况下不包括它)。您可以从Oracle下载“Java Cryptography Extension(JCE)Unlimited Strength Priority Policy Files”,并按照安装说明进行操作(实际上,您需要用下载的策略文件替换JRE lib/security目录中的两个策略文件)。

即我们的加解密工作,需要Java Cryptography Extension(JCE)环境的帮助。这里我们介绍一下JCE:

JCE,即Java Cryptography Extension,在早期JDK版本中,由于受美国的密码出口条例约束,Java中涉及加解密功能的API被限制出口,所以Java中安全组件被分成了两部分: 不含加密功能的JCA(Java Cryptography Architecture )和含加密功能的JCE(Java Cryptography Extension)。在JDK1.1-1.3版本期间,JCE属于扩展包,仅供美国和加拿大的用户下载,JDK1.4+版本后,随JDK核心包一起分发。

根据上述介绍我们可以知道,只要我们使用的是JDK1.3以上版本(这里我们使用的是JDK1.8),就可以去官网下直接下载JCE拓展包了。这里官方文档给了我们下载地址(这里我们下载JCE8):

https://www.oracle.com/java/technologies/javase-jce8-downloads.html

【Spring Cloud总结】35.配置属性加解密之对称加密

下载完毕,解压后,我们可以看到有两个jar文件:

【Spring Cloud总结】35.配置属性加解密之对称加密

这两个jar文件其实就是两个策略文件,即加密和解密的策略文件。这两个文件的安装,就是要替换JDK里面这两个同名jar包:

【Spring Cloud总结】35.配置属性加解密之对称加密

替换完成后,算是将JCE正式更新到JDK中,我们就可以使用JCE的加密解密策略了。

JCE的API都在javax.crypto包下,核心功能包括:加解密、密钥生成(对称)、MAC生成、密钥协商,而其加解密功能由Cipher组件提供。具体的例子见下面的一篇博文:

https://blog.csdn.net/L_chong/article/details/84745479

二、配置对称加密的密钥

然后在我们之前写的Config的服务端microserver-config-server工程的src/main/resource文件夹下,新建bootstrap.yml文件,添加对称加密的key(密钥):

encrypt:
  key: jce-Test-666666
           

这里的encrypt.key就是我们对称加密需要的密钥。

这里为什么需要在bootstrap.yml文件中配置,而不是原来的application.yml配置呢?

这是因为config server启动的时候,需要先加载启动上下文配置文件bootstrap.yml,而此时系统就要读取encrypt.key参数了,但默认的bootstrap.yml配置文件中,密钥是空的,所以在后面执行加密的过程中,系统会报:

The encrytion algorithm is not strong enough
           

的异常,即加密算法复杂度不够健壮。所以我们必须在bootstrap.yml上下文配置文件中就要将encrypt.key参数配置进去。

当我们重启服务时,Config Server检测到这项配置时,会自动启用加密功能,并新增两个POST接口 /encrypt和 /decrypt。这两个接口通过后台配置的密钥来进行加密和解密。

注:千万要保证工程使用的JDK是替换后的JDK,而不是编译器自带的JDK:

【Spring Cloud总结】35.配置属性加解密之对称加密

三、验证对称加密功能

然后我们重启应用,使用post man工具,访问其encrypt端点:

【Spring Cloud总结】35.配置属性加解密之对称加密

可以看到,/encrypt端点可以将我们的明文“hello”加密为“cfe9f14fd84b9c5c6b8faff4c89ce9244e3b136963c1320b03703c02d30d43a4”。

然后我们来访问decrypt端点,来解密刚刚的密文:

【Spring Cloud总结】35.配置属性加解密之对称加密

可以看到,/decrypt端点将刚刚的密码解密为了“hello”。

以上就是使用JCE进行加解密的功能,使用起来是不是很简单?那么如何将我们的配置进行这种加解密呢?

跟简单,就是我们先使用刚刚的手法,将我们的Spring-Cloud-Config-Test仓库下的application-prod.yml中的“type: prod”内容中的“prod”,使用encrypt端点进行加密,得到的密文为:

8b048620da222eb25c712dff182e9180f2e0d3dffc3da6022acaa24eb0d51009

然后将其重新配置到application-prod.yml中:

type: '{cipher}8b048620da222eb25c712dff182e9180f2e0d3dffc3da6022acaa24eb0d51009'
           

注意,这里需要将密文前后加单引号,并且在密文内容前添加“{cipher}”,以标记该内容为加密内容。

这里详细说一下,关于密文的配置规则,官方文档上的说明为:

yml文件的配置样例: 

spring:
  datasource:
    username: dbuser
    password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
           

properties文件的配置样例: 

spring.datasource.username: dbuser
spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
           

注意yml配置是带单引号“'”的,properties配置是不带单引号“'”的。

因为这里我们使用的是yml文件,所以我们遵循了上面的配置格式。

然后将该配置提交至远端gitee仓库:

【Spring Cloud总结】35.配置属性加解密之对称加密

然后我们重启服务,访问 端点,发现通过Config Server可以自动解密仓库中的密文,直接反馈出明文:

【Spring Cloud总结】35.配置属性加解密之对称加密

同理,Config Client去获取Config Server的时候,也是不需要进行解密的,因为Config Server已经帮我们解密过了。

至此,配置属性的对称加密操作已经讲解完毕,下一篇我们继续讲解配置属性的非对称加密操作。

参考:《51CTO学院Spring Cloud高级视频》

https://blog.csdn.net/daguanjia11/article/details/94029635

https://blog.csdn.net/L_chong/article/details/84745479

转载请注明出处:https://blog.csdn.net/acmman/article/details/105164516

继续阅读