概述
接上篇《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文件内容:
我们可以看到配置文件的内容通过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
下载完毕,解压后,我们可以看到有两个jar文件:
这两个jar文件其实就是两个策略文件,即加密和解密的策略文件。这两个文件的安装,就是要替换JDK里面这两个同名jar包:
替换完成后,算是将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:
三、验证对称加密功能
然后我们重启应用,使用post man工具,访问其encrypt端点:
可以看到,/encrypt端点可以将我们的明文“hello”加密为“cfe9f14fd84b9c5c6b8faff4c89ce9244e3b136963c1320b03703c02d30d43a4”。
然后我们来访问decrypt端点,来解密刚刚的密文:
可以看到,/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仓库:
然后我们重启服务,访问 端点,发现通过Config Server可以自动解密仓库中的密文,直接反馈出明文:
同理,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
最后
以上就是自然机器猫为你收集整理的【Spring Cloud总结】35.配置属性加解密之对称加密的全部内容,希望文章能够帮你解决【Spring Cloud总结】35.配置属性加解密之对称加密所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复