当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Cloud Config RSA简介及使用RSA加密配置文件的方法

Spring Cloud Config RSA简介及使用RSA加密配置文件的方法

2019年07月19日  | 移动技术网IT编程  | 我要评论

spring cloud 为开发人员提供了一系列的工具来快速构建分布式系统的通用模型 。例如:配置管理、服务发现、断路由、智能路由、微代理、控制总线、一次性token、全局锁、决策竞选、分布式session、集群状态等等。分布式系统的协助需要一大堆的模型,使用spring cloud开发者能快速的建立支持实现这些模式的服务和应用程序。他们将适用于任何分布式环境,无论是开发者的个人电脑还是生产环境,还是云平台。

特性

spring cloud 专注于提供良好开箱即用的典型方案和可扩展方式。

  • 分布式/版本化配置
  • 服务注册/服务发现
  • 路由
  • 服务间调用
  • 负载均衡
  • 断路器
  • 全局锁
  • 领导选取和集群状态监控
  • 分布式消息

简介

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 key
    rsaprivatecrtkey key = (rsaprivatecrtkey) store.getkey(alias, password);
    // 定义 public key 生成规则
    rsapublickeyspec spec = new rsapublickeyspec(key.getmodulus(),
        key.getpublicexponent());
    // 生成 public key
    publickey 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 -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 访问此配置文件:

得到如下结果:

{
  "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加密配置文件的方法,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网