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.keystorealias: config-serverpassword: 123456secret: 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
Spring Cloud之 Config 中 配置文件的加密与解密相关推荐
- Spring Cloud教程(十二)加密和解密
Spring Cloud具有一个用于在本地解密属性值的Environment预处理器.它遵循与Config Server相同的规则,并通过encrypt.*具有相同的外部配置.因此,您可以使用{cip ...
- ASP.NET2.0中配置文件的加密与解密
首先添加引用: using System.Web.Configuration; 加密操作如下: private void ProtectSection(string sectionName, stri ...
- Spring Cloud Dalston.RELEASE中文文档
Spring Cloud Dalston.RELEASE中文文档 Spring Cloud 目录 特性 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序 ...
- Spring Cloud Alibaba 官方中文文档
Spring Cloud Alibaba 官方中文文档 1. 介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用服务的必需组件,方便开发者通 ...
- Spring Cloud入门-Config分布式配置中心(Hoxton版本)
文章目录 Spring Cloud入门系列汇总 摘要 Spring Cloud Config 简介 在Git仓库中准备配置信息 配置仓库目录结构 master分支下的配置信息 dev分支下的配置信息 ...
- Spring Cloud Netflix Zuul中的速率限制
来源:SpringForAll社区 1.引言 Spring Cloud Netflix Zuul 是一个包含Netflix Zuul的开源网关.它为Spring Boot应用增加了一些特别的特性.不幸 ...
- spring cloud Alibaba Sentinel中文文档
spring cloud Alibaba Sentinel中文文档 github中的中文文档:https://github.com/alibaba/Sentinel/wiki/介绍
- 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
- java中md5加密和解密_如何在java中实现md5加密和解密
如何在java中实现md5加密和解密 关注:273 答案:1 mip版 解决时间 2021-01-19 20:37 提问者精神疯裂 2021-01-19 05:36 如何在java中实现md5加密 ...
最新文章
- 刚进园子,广州的冬天像夏天
- Nature封面:每天工作21.5小时的AI化学家,8天内完成688个实验,已自主发现一种全新催化剂...
- 学习响应式BootStrap来写融职教育网站,Bootsrtap第四天Header处理
- 动态与代理AOP--01【代理的作用与概念】【动态代理与AOP】
- Scrapy爬虫抓取ZOL手机详情
- Oracle 11g中关于数据定义的思考
- Could not install packages due to an EnvironmentError: [Errno 13] Permission denied解决办法
- 牛客寒假算法基础集训营4
- C#实现--单链表(链式)
- POJ2352 Stars
- linux 基础笔记
- 计算机编程的地位,学习编程的重要性
- 哈利波特3 阿兹卡班的囚徒
- 360 网站服务器漏洞扫描,360Webscan
- S4 HANA CO和FI自动集成:成本中心分配分摊业务实践-KSV5/KSU5
- 【考试记录】阿里云大学Apsara Clouder云安全专项技能认证:云平台使用安全
- 计算机主机内有的硬件有,怎么看电脑配置?查看电脑配置方法有哪些?
- 用户体验思考与flex三坑:元素不均分、溢出不省略和垂直不滚动
- 经典趣味数学问题之过河问题
- 怎样参与火箭计划币_从目的到计划不是火箭科学
热门文章
- vue3搭建多页面应用的方法
- 浙江大学C语言线上开发环境,浙江大学“程序设计入门:C语言”刚刚开课随时报名...
- 计算机考试二级模拟试题,2015年计算机等级考试二级VB模拟试题
- BlackBerry 9900通过 中国银行卡检测中心SWP-NFC通讯认证
- 死磕Ubuntu18(完)
- 用友软件显示系统加密服务器,用友云主机指向加密服务器
- CompactPCI
- openjudge 1.7.6 合法C标识符
- 《关于建立统一的城乡居民基本养老保险制度的意见》
- 苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置