实际应用中会涉及很多敏感的数据,这些数据会被加密保存到 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. python cmd的各种实现方法及优劣

    Python_cmd的各种实现方法及优劣(subprocess.Popen, os.system和commands.getstatusoutput)   目前我使用到的python中执行cmd的方式有 ...

  2. webservice接口,用Soapui

    webservice接口怎么测试呢,他不需要你在拼报文了,会给一个webservice的地址,或者wsdl文件,直接在soapui导入,就可以看到这个webservice里面的所有接口,也有报文,直接 ...

  3. Django中STATIC_URL、STATIC_ROOT、STATICFILES_DIRS 的区别关系

    首先,我们配置静态文件,要在setting.py里面加入如下几行代码: settings.py # the settings above # STATIC SETTINGS STATIC_URL = ...

  4. 移动端click事件无反应或反应慢 touchend事件页面滑动时频繁触发

    H5页面的点击事件click 无论在浏览器 iframe还是小程序里面 都会出现点击无反应或者反应慢的情况出现 所以决定用touchend事件来代替click 但是touchend事件触发比较灵敏 在 ...

  5. 软工个人作业4——Alpha阶段个人总结

    一.个人总结 1.在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 经过本次alpha阶段的冲刺,首先学到了很多,收获了很多,同时也蛮辛苦的.其实我觉得作为组员我有很认 ...

  6. 语言模型(N-Gram)

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

  7. 学号 20175223 《Java程序设计》第9周学习总结

    目录 教材学习内容总结 教材学习中的问题和解决过程 1. 输出文件时过多输出. 代码调试中的问题和解决过程 1. 问题:费马素性检验程序. [代码托管] 学习进度条 参考资料 目录 教材学习内容总结 ...

  8. ubuntu 18.04启动samba图形管理界面

    启动samba图形界面管理器出现错误: Failed to load module "canberra-gtk-module" 或 SystemError: could not o ...

  9. spring cloud使用Feign做消费端时的eureka.client.registerWithEureka/eureka.client.fetchRegistry是否配置的问题

    记录一下今天工作中的一个小失误. 今天用Feign搭建服务消费者的时候,考虑消费者不需要再提供服务给其他服务,所以不需要注册到注册中心(eureka)中.结果把registerWithEureka和f ...

  10. Java中String类型的数据比较

    在Java中如果想比较两个字符串是否相等,可以使用string1==string2 或string1.equal(string2)来比较. 但是,第一种方法过于局限.例如, String string ...