实际应用中会涉及很多敏感的数据,这些数据会被加密保存到 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. 【亲测】Asp.net Mvc5 + EF6 code first 方式连接MySQL总结

    本文原文地址为:https://www.cnblogs.com/summit7ca/p/5423637.html 原文测试环境为windows 8.1+Vs2013+MySql5.7.12 本人在wi ...

  2. 语言模型(N-Gram)

    问题描述:由于公司业务产品中,需要用户自己填写公司名称,而这个公司名称存在大量的乱填现象,因此需要对其做一些归一化的问题.在这基础上,能延伸出一个预测用户填写的公司名是否有效的模型出来. 目标:问题提 ...

  3. makefile笔记4 - makefile命令

    每条规则中的命令和操作系统 Shell 的命令行是一致的. make 会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的. 在命令行之间中的空 ...

  4. 从.net parallel角度解读spark

    对于我这样一个一直工作在.net平台上的developer来讲,Hadoop,Spark,HBase等这些大数据名词比较陌生,对于分布式计算,.net上也有类似的Parallel(我说的不是HDIns ...

  5. mysql_pconnect 问题

    不同于mysql_connect的短连接,mysql_pconnect持久连接的时候,将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接 ...

  6. Vue-devtools安装步骤

    今天跟着网上参考的vue调试工具安装的方法,总结出更完善的步骤: 步骤一:调往链接地址 https://github.com/vuejs/vue-devtools 步骤二:解压链接地址中的包,到本地桌 ...

  7. vue 打印功能

    printContent (e) { let subOutputRankPrint = document.getElementById('subOutputRank-print') console.l ...

  8. jQuery-4.动画篇---淡入淡出效果

    jQuery中淡出动画fadeOut 让元素在页面不可见,常用的办法就是通过设置样式的display:none.除此之外还可以一些类似的办法可以达到这个目的.这里要提一个透明度的方法,设置元素透明度为 ...

  9. ODI Scenario 场景

    ODI中,场景的作用类似发布版本,当映射最终修改版完成时,可以生成场景.无论是映射(Mapping)还是包(Package)都可以生成场景. 包调用映射和调用场景的区别: 1,包直接调用映射,当映射修 ...

  10. ccf-集合竞价-201412-3

    这道题数据量很小,所以用前缀和直接暴力解决了 首先将浮点数转换为整数; int_p=(int)(dou_p*100+0.5); 必须加一个eps,否则浮点数运算会有误差 然后从高到低枚举 #inclu ...