简介

RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的。因为RSA算法会涉及Private Key和Public Key分别用来加密和解密,所以称为非对称加密。Private Key和Public Key有互操作性,即用private key加密的可以用public key解密,用public key加密的可以用private key解密。传统的单向认证则只用public key进行加密,有private key的一方才可进行解密。例如,一个web服务器会有一对private key和public key。浏览器客户端保存着服务器的public key。当客户端需要向服务器发送数据时,就用服务器的public key进行加密,然后服务器收到数据时,再用private key进行解密。客户端验证服务器是否为真实的服务器时,会根据服务器提供的public key和自己本地保存的public key作比较,一致的话才能验证服务器的真实性。

在我们的config server中,一些对加密要求比较高的可以采用RSA算法进行数据的加密和解密。

项目源码

Gitee码云

生成测试Keystore

我们需要使用jdk自带的keytool工具生成一个keystore,里边保存了private key的信息,使用如下命令行:

keytool -genkeypair -alias config-server-key -keyalg RSA -dname "CN=Config Server,OU=Xuqian,O=My Own Company,L=Beijing,S=Beijing,C=CN" -keypass changeit -keystore server.jks -storepass changeit
复制代码

-genkeypair 参数即产生一对public key和private key。 -alias 指定key的别名,用于区分同一keystore中不同的key。 -keyalg 指定生成key的算法,这里使用默认的RSA -dname 指定common name,即CN,用以验证key的身份。其中各项皆为自定义参数,OU为单位名称,O为组织名称,L为城市,S为省份/州,C为国家 -keypass 为key的密码 -keystore 为keystore的文件名 -storepass 访问keystore的密码

上述工具将产生的 privte key 保存在了名为server.jks的 key store 中。到目前为止,我们只产生了 private key,Spring Cloud Config Server 会根据我们提供的 key 的信息,每次会用程序生成一个 public key,参考如下源代码org.springframework.security.rsa.crypto.KeyStoreKeyFactory

public KeyPair getKeyPair(String alias, char[] password) {try {synchronized (lock) {if (store == null) {synchronized (lock) {// 根据配置提供的 keystore 文件地址和密码获取 keystore 的实例对象store = KeyStore.getInstance("jks");store.load(resource.getInputStream(), this.password);}}}// 根据配置提供的 alias 和 password 从 keystore 中取得 private keyRSAPrivateCrtKey key = (RSAPrivateCrtKey) store.getKey(alias, password);// 定义 Public Key 生成规则RSAPublicKeySpec spec = new RSAPublicKeySpec(key.getModulus(),key.getPublicExponent());// 生成 Public KeyPublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(spec);return new KeyPair(publicKey, key);}catch (Exception e) {throw new IllegalStateException("Cannot load keys from store: " + resource, e);}
}
复制代码

这里使用了 Java Security API 来对key进行操作。参见注释。然后上边的信息通过 configserver 中的 bootstrap.xml 配置文件提供:

encrypt:#key: Thisismysecretkey
  key-store:
    location: file://${user.home}/development/keys/server.jks
    password: changeit
    alias: config-server-key
    secret: changeit
复制代码

因为我们不能同时使用对称加密和非对称加密,所以我们把 encrypt.key 配置注释掉,然后指定非对称加密的参数:

  • location: Keystore 的文件路径
  • password: keystore 的密码
  • alias: key 的别名
  • secret: key的密码

测试

我们继续使用 encrypt API加密一项测试数据:

curl http://localhost:8888/encrypt -d 23456789
复制代码

返回加密后的字符:

AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=
复制代码

然后测试解密

curl http://localhost:8888/decrypt -d AQAPWOUOh4+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=
复制代码

会返回

23456789
复制代码

我们还可以修改web-client.yml来验证:

#test:#password: '{cipher}94c1027141add9844ec47f0be13caebb6b38ed1dcf99811b1a5cd2b874c64407'
user:
  password: '{cipher}AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils='
复制代码

注释掉 test.password,新增一个 user.password 使用加密后的配置值。然后提交的gitee仓库,通过 url 访问此配置文件:

http://localhost:8888/web-client/default
复制代码

得到如下结果:

{"name": "web-client","profiles": ["default"],"label": null,"version": "3044a5345fb86d09a043ca7404b9e57c8c13c512","state": null,"propertySources": [{"name": "https://gitee.com/zxuqian/spring-cloud-config-remote/web-client.yml","source": {"message": "此条消息来自于远程配置仓库","management.endpoints.web.exposure.include": "*","user.password": "23456789"}}]
}
复制代码

Spring Cloud Config - RSA简介以及使用RSA加密配置文件相关推荐

  1. Spring Cloud Config Server简介

    1.概述 在本教程中,我们将回顾Spring Cloud Config Server的基础知识. 我们将设置一个Config Server ,然后构建一个客户端应用程序 ,该客户端应用程序在启动时会消 ...

  2. Spring Cloud教程– Spring Cloud Config Server简介

    问题 SpringBoot在通过属性或YAML文件外部化配置属性方面提供了很大的灵活性. 我们还可以使用特定于配置文件的配置文件(例如application.properties , applicat ...

  3. Spring Cloud Config 配置的加密解密

    配置内容的加密解密 很多场景下很多场景下,对于某些敏感的配置内容,例如数据库账号密码等应当加密存储.Config Server为配置内容的加密与解密提供了支持. 安装JCE Config Server ...

  4. spring vault_微服务–第2部分:使用Spring Cloud Config和Vault进行配置管理

    spring vault 在使用Spring Boot和Spring Cloud的MicroServices –第1部分:概述中 ,我们简要介绍了什么是微服务以及如何使用SpringBoot和Spri ...

  5. Spring Cloud Config Server

    spring cloud config server 官方文档 本地保存配置文件 先创建一个空项目 创建 config-server 作为Model创建 再创建 config-client 作为mod ...

  6. 《深入理解 Spring Cloud 与微服务构建》第十三章 配置中心 Spring Cloud Config

    <深入理解 Spring Cloud 与微服务构建>第十三章 配置中心 Spring Cloud Config 文章目录 <深入理解 Spring Cloud 与微服务构建>第 ...

  7. Go微服务 - 第八部分 - 使用Viper和Spring Cloud Config进行集中配置

    第八部分: Go微服务 - 使用Viper和Spring Cloud Config进行集中配置 在第八部分,我们探索Go微服务中使用Spring Cloud Config进行集中配置. 简介 考虑到微 ...

  8. spring cloud连载第二篇之Spring Cloud Config

    Spring Cloud Config Spring Cloud Config为分布式服务提供了服务侧和客户侧的外部配置支持.通过Spring Cloud Config你可以有一个统一的地方来管理所有 ...

  9. Spring Cloud Config 加密和解密

    重要 先决条件:要使用加密和解密功能,您需要在JVM中安装全面的JCE(默认情况下不存在).您可以从Oracle下载"Java加密扩展(JCE)无限强度管理策略文件",并按照安装说 ...

最新文章

  1. vsphere---vmotion
  2. python itertools product函数
  3. jni java共享变量_JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量 .
  4. 要你命3000-List29
  5. 史无前例! 中国学者一天发6篇Nature,在多领域取得重大进展
  6. python处理LINUX的PWD文档
  7. c++的学习——画矩形
  8. 计算机模拟水循环的过程,“SWAT主要作物水循环模拟方法详解”的学习及心得...
  9. 异常来自 HRESULT:0x80070057 (E_INVALIDARG)
  10. 软件打包部署神器InnoSetup
  11. Android使用adb截屏
  12. 4.顺序栈和循环队列的基本运算
  13. 文件 或者 图片 与 base64 之间的转换
  14. python opencv手势识别_OpenCV+Python3.5 简易手势识别的实现
  15. 遇到无法打出的字怎么办?
  16. bluetooth pdf_这个pdf软件很okk,速来get!
  17. forkJoin源码解读
  18. 在线Json转Dart
  19. scratch 3 安装过程图
  20. STM32红外遥控实验(发射器和接收器)

热门文章

  1. 作业4:结对编程项目四则运算
  2. 聊天软件项目TCP升级版
  3. C#的Attribute
  4. 服务器Context、虚拟主机配置(管理、配置)
  5. 每日英语:Is austerity good for your health?
  6. C#里如何遍历枚举所有的项
  7. SVN提示: File or directory '*' is out of date; try updating 解决方案
  8. cocos2d-x AssetsManager libcurl使用心得
  9. Span中显示内容过长显示省略号---SpringCloud Alibaba_若依微服务框架改造_前端基于Vue的ElementUI---工作笔记011
  10. OpenGL绘制旋转茶壶