实际应用中会涉及很多敏感的数据,这些数据会被加密保存到 SVN 仓库中,最常见的就是数据库密码。Spring Cloud Config 为这类敏感数据提供了加密和解密的功能,加密后的密文在传输给客户端前会进行解密。配置服务支持对称加密(AES算法)和非对称加密(RSA算法)。

在使用配置服务的加密和解密功能,首先必须安装 JCE(Java Cryptography Extension),可以到 Oracle 的官方网站下载(下载地址),解压缩后会得到 local_policy.jar 和 US_export_policy.jar 两个 jar 包,将其复制到 $JAVA_HOME/jre/lib/security 目录中,即可完成安装。

 
 

  • 对称加密配置

    对称加密使用一套密钥来进行加密和解密,我们需要在配置服务的 src/main/resources 目录下创建 bootstrap.yml (application.yml 配置不生效)配置文件,来配置使用对称加密的密钥,如下:

    #对称加密密钥配置

    encrypt:

    配置了密钥后,可以启动项目,访问 http://localhost:8080/encrypt/status 可以查看密钥的配置是否正确,如果出现 {"status":"OK"} 表示密钥配置正确,如果出现 {"description":"No key was installed for encryption service","status":"NO_KEY"} 表示配置有错误,需要确认 JCE 的安装及密钥配置。

  • 非对称加密配置

    非对称加密使用的是一对密钥,使用公钥加密私钥解密,可以使用 keytool 工具生成一对密钥用于加密和解密,生成密钥的命令如下:

    keytool -genkeypair -alias "config-server-key" -keyalg "RSA" -keystore "e:\temp\config-server-key.keystore" -validity 3560

    生成非对称密钥后,将生成的密钥库文件复制到 src/main/resources 目录下,并将相关信息配置到配置服务中,我们需要在配置服务的 src/main/resources 目录下创建 bootstrap.yml (application.yml 配置不生效)配置文件,来配置使用非对称加密的密钥,如下:

    #非对称加密配置

    encrypt:

    key-store:

    #密钥库文件路径

    location:classpath:/config-server-key.keystore

    #密钥库密码

    password:liyong

    #密钥库的别名

    alias:config-server-key

    #密钥密码

    secret:liyong

     
     

    同样,配置了密钥后,可以启动项目,访问 http://localhost:8080/encrypt/status 可以查看密钥的配置是否正确,如果出现 {"status":"OK"} 表示密钥配置正确,如果出现 {"description":"No key was installed for encryption service","status":"NO_KEY"} 表示配置有错误,需要确认 JCE 的安装及密钥配置。

  • 加密和解密数据

    在配置好密钥后,我们可以通过访问配置服务的 /encrypt 和 /decrypt 端点来进行加密或者解密,需要使用 HTTP 的 POST 方法,将需要加密的内容或者密文放在请求体中,如下:

    POST http://localhost:8080/encrypt HTTP/1.1

    User-Agent: Fiddler

    Host: localhost:8080

    Content-Length: 30

    Authorization: Basic bGl4dWU6bGl5b25n

    Content-Type: text/plain;charset=UTF-8

     
     

    这个是明文,需要加密

     
     

    请求返回的响应体内容就是加密后的密文,如下:

    HTTP/1.1 200

    X-Application-Context: spring-cloud-config:subversion:8080

    X-Content-Type-Options: nosniff

    X-XSS-Protection: 1; mode=block

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate

    Pragma: no-cache

    Expires: 0

    X-Frame-Options: DENY

    Strict-Transport-Security: max-age=31536000 ; includeSubDomains

    Content-Type: text/plain;charset=UTF-8

    Content-Length: 408

    Date: Tue, 24 Apr 2018 13:15:56 GMT

     
     

    AQBBSHmmQXVq/NvFdIWHGZo1I6KwSMX8ySp/YkMoWpUGA+h4lczFvHbtkprkuvPNxqQ79V4ZnmoIsFKTJwgBAY6YDhQrqDnli51Q7LZTDOCMWjerdWZrzBog01bz5bFsDJGTPSz0dvYg8uJXzD09e7o7BGguJ3upgnNMuA4hpfVrSENhLZg1DfoudJDVWj1WwHyIUGeAM1kq1FzoMAkiYi0ifP0N59JugH8AsHN6Cs2Pb3TmQwiXDJ36ejvM5zyByANxSGRtHjV0jXWK23shVGjs0Pn9oWMLkpsT7/U2qDPNpGUYIUTKsQsz/BncsaLJY1OODWQ1xgMEnBXafIKkBEgQHLRpQmnzWdBIKx6fU483D7rGuSF7Et3xXFMZ9ztGb93FinIIbwRR1WD4eTjyKHQ1

    我们使用密文提交 /decrypt 进行解密,将密文放入请求体中,如下:

    POST http://localhost:8080/decrypt HTTP/1.1

    User-Agent: Fiddler

    Host: localhost:8080

    Content-Length: 408

    Authorization: Basic bGl4dWU6bGl5b25n

    Content-Type: text/plain;charset=UTF-8

     
     

    AQBBSHmmQXVq/NvFdIWHGZo1I6KwSMX8ySp/YkMoWpUGA+h4lczFvHbtkprkuvPNxqQ79V4ZnmoIsFKTJwgBAY6YDhQrqDnli51Q7LZTDOCMWjerdWZrzBog01bz5bFsDJGTPSz0dvYg8uJXzD09e7o7BGguJ3upgnNMuA4hpfVrSENhLZg1DfoudJDVWj1WwHyIUGeAM1kq1FzoMAkiYi0ifP0N59JugH8AsHN6Cs2Pb3TmQwiXDJ36ejvM5zyByANxSGRtHjV0jXWK23shVGjs0Pn9oWMLkpsT7/U2qDPNpGUYIUTKsQsz/BncsaLJY1OODWQ1xgMEnBXafIKkBEgQHLRpQmnzWdBIKx6fU483D7rGuSF7Et3xXFMZ9ztGb93FinIIbwRR1WD4eTjyKHQ1

    请求返回的响应体内容就是解密后的明文,如下:

    HTTP/1.1 200

    X-Application-Context: spring-cloud-config:subversion:8080

    X-Content-Type-Options: nosniff

    X-XSS-Protection: 1; mode=block

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate

    Pragma: no-cache

    Expires: 0

    X-Frame-Options: DENY

    Strict-Transport-Security: max-age=31536000 ; includeSubDomains

    Content-Type: text/plain;charset=UTF-8

    Content-Length: 30

    Date: Tue, 24 Apr 2018 13:19:02 GMT

     
     

    这个是明文,需要加密

     
     

  • SVN 存储加密数据

    在 SVN 仓库中的 yml 或者 ptoperties 配置文件中,使用 "{cipher}密文" 的格式来保存加密后的数据,例如,密钥为 myKey,MySQL 数据库的密码为 liyong,那么密文为 16bf88a2362c6b7a60c28c8608ab4a80f4b497dc294731f151e7822ac565a899,那我们配置在 SVN 仓库的配置文件需要如下配置:

    spring:

    application:

    name:spring-cloud-config-client-dev

    server:

    info:

    name:refresh

    desc:aa

    mysql:

    passwd:'{cipher}b60b034ba08e4f4d02135a5a1eb31679506667afe91e0da7245fafdd9b0a1d19'

     
     

    启动配置服务后,访问 http://localhost:8080/test/spring-cloud-config-client-dev.yml 可以看到浏览器的输出:

    info:

    desc:aa

    name:refresh

    mysql:

    passwd:liyong

    server:

    spring:

    application:

    name:spring-cloud-config-client-dev

     
     

     
     

Spring Cloud(Dalston.SR5)--Config 集群配置中心-加解密的更多相关文章

  1. Spring Cloud(Dalston.SR5)--Config 集群配置中心

    Spring Cloud Config 是一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,他分为服务端和客户端两个部分.服务端也称为分布式配置中心,是一个独立的微服务 ...

  2. Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置

    远程 SVN 服务器上面的配置修改后,需要通知客户端来改变配置,需要增加 spring-boot-starter-actuator 依赖并将 management.security.enabled 设 ...

  3. Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置

    Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 H ...

  4. spring boot 2.0.3+spring cloud (Finchley)6、配置中心Spring Cloud Config

    https://www.cnblogs.com/cralor/p/9239976.html Spring Cloud Config 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持, ...

  5. Spring Cloud(Dalston.SR5)--Eureka 服务提供者

    要使微服务应用向注册中心发布自己,首先需要在 pom.xml 配置文件中增加对 spring-boot-starter-eureka 的依赖,然后在主类中增加 @EnableDiscoveryClie ...

  6. Spring Cloud(Dalston.SR5)--Eureka 注册中心搭建

    基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务治理可以说是微服务架构中最为核心和基础的模块,他主要用来实现各个微服务实例的自动化注册与发现 服务注册:在 ...

  7. Spring+quartz 实现定时任务job集群配置

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  8. Spring+quartz 实现定时任务job集群配置【原】

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  9. Spring Cloud学习笔记【九】配置中心Spring Cloud Config

    Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端 ...

随机推荐

  1. Oil Deposit

    题目描述: The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. ...

  2. Windows下杀掉全部的子线程

    最近遇到一个问题,就是在Windows下怎么杀掉全部的子线程,现把解决方法记录下. 问题来源: 用python执行了一个bat脚本,脚本的内容是执行一系列的adb命令,然后运行一个server.其中需 ...

  3. Unix代码分析

    世存最早的unix源代码:http://minnie.tuhs.org/cgi-bin/utree.pl?file=PDP7-Unix/sys 世存最早的cc:http://minnie.tuhs.o ...

  4. JS 最简单数组去重

    ,,,,])) // 再把set转变成array console.log(newArr) // [1,2,3,4]

  5. 通过ajax提交表单上传文件

    //这是看的大神的.//原地址:https://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html $("#sub" ...

  6. 删除Docker镜像

    删除镜像:1)先杀死镜像中所有容器   docker kill $(docker ps -a -q)2)删除镜像中所有容器:   docker rm $(docker ps -a -q)3)删除镜像: ...

  7. Linux 驱动——Button8(输入子系统)

    输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动.键盘按下等通过Driver->Inputcore->Event handler->userspac ...

  8. 两个action之间进行跳转

    名字 说明 Chain 用来处理Action链 Dispatcher 用来转向页面,通常处理JSP FreeMarker 处理FreeMarker模板 HttpHeader 用来控制特殊的Http行为 ...

  9. 使用Axure做验证码之获取验证码(一)

    本次作业,制作验证码,仅完成获取验证码操作,如下: 分析: 左图为矩形,主要展示验证码(本例设置4位验证码),其中验证码为字母和数字组合: 右图为文本输入框,主要设置点击事件,即点击文本文字,矩形框中 ...

  10. ActiveMq 安装

    系统是centos 6.5的 下载ActiveMq的包   下载地址  http://activemq.apache.org/download.html 我下载的是   apache-activemq ...