实际应用中会涉及很多敏感的数据,这些数据会被加密保存到 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. vue学习笔记——篇3

    1.绑定计算后数据,三种方式: >1.红色框,通过method >2.黄色框,通过computed >3.蓝色框,通过watch 推荐computed,vue对computed做了缓 ...

  2. [Kafka] [All about it]

    Overview 设计目标: 以O(1) 常数级时间复杂度的访问性能,提供消息持久化能力. 高吞吐率. 支持 kafka server 间的消息分区,及分布式消费,同时保证每个partition内部的 ...

  3. sdl2在vs2012上的配置

    网上关于sdl2的配置教程很多,我尽量将我遇到的问题分享给大家. 首先,打开VS2012: 2.点击新建项目:选择空项目,确定即可 (文件名,保存位置,解决方案名称,可以随便填,(我取名为sdlpla ...

  4. python基础13_zip_import

    继续内置函数,zip函数被比喻成拉链,将两边的齿对应起来. #!/usr/bin/env python # coding:utf-8 ## 比喻像个拉链,将两边对应起来. # 多出来的部分,不作处理. ...

  5. TCP学习总结(二)

    前面一节咱们介绍完了TCP协议,这部分,将要介绍,TCP是如何实现可靠传输的. TCP的可靠传输 1.滑动窗口 上一节我们介绍TCP报文段头部的时候说得到,"窗口"这个部分,&qu ...

  6. in条件后面有多个字段,in后面只能有一个字段 Operand should contain 1 column(s)

    今天在sql测试的时候发现了这个错误:Operand should contain 1 column(s). 原因是in条件后面有多个字段,in后面只能有一个字段.

  7. c语言——鞍点

    描述 找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10. 输入 输入数据有多行,第一行有两个数m和n,下面有m行,每行有n ...

  8. 关于实时监听input的值得变化的问题

    onchange 关于input的onchange事件  其实是有出发条件的  并非实时监听的 1.鼠标点击事件  或者键盘事件(tab和wins键都可以触发  enter在ie9时不触发,火狐和ch ...

  9. String与StringBuffer之间的转换

    来源:http://www.oschina.net/code/snippet_2261089_47352 package demo; /* String与StringBuffer之间的转换 * Str ...

  10. FreeCAD_DWG文件格式支持

    FreeCAD 是一款开源的三维模型制作软件,体积小.功能强大,可结合软件包划分网格进行有限元分析,上手速度极快.但也存在问题,即软件自身不支持DWG文件格式.本文介绍 FreeCAD 支持 DWG格 ...