Encryption and Decryption

重要

前提条件:为了使用加密和解密功能,需要在jvm中安装完全的JCE。可从oracle官网进行下载,并且安装说明进行安装(用下载文件替换2个策略文件)

如果远程的属性资源包含加密内容(以{cipher}开始的value),这些value会在发送到客户端之前被解密。优点在于属性值在git repository中不必是纯文本形式。如果value不能被解密,会从属性资源中删除,并且使用相同的key添加一个额外的属性,使用"invalid."前缀。value值通常为"<n\/a>".这主要是为了防止被用作密码的加密文体产生泄露。

如果正在构建远程配置仓库,包含的application.yml 如下所示

application.yml

spring:
  datasource:
    username: dbuser
    password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'

在.properties文件中加密的值不能在引号中,否则不会被解密。

application.properties

spring.datasource.username: dbuser
spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ

这样你就可以把纯文本推送到共享的git库中,而密码是被加密保护的。

服务端暴露了\/encrypt and \/decrypt接口(假设它们是安全的,只有被认证后才能访问)。可以通过post请求\/encrypt对信息进行加密。

$ curl localhost:8888/encrypt -d mysecret
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda

通过\/decrypt进行逆向的操作

$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret

在把它提交到远程,不安全的存储之前,在加密的值前追加{cipher}前缀,放入到YAML or properties 文件中。

\/encrypt 和 \/decrypt 端可以接收\/*\/{name}\/{profiles} 的形式。这样可以用来控制每一个应用和profile的加密。

注意

为了在这种力度下控制加密,必须要提供TextEncryptorLocator的Bean,这样会为每个应用和profiles创建不同的加密。默认提供的并不会这样(所以所有的加密使用了同一份秘钥)

spring command line 客户端同样可以用来加密和解密。

$ spring encrypt mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret

为了使用文件中的密钥,需要在添加@符,并提供文件路径。

$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...

results matching ""

    No results matching ""