加密和解密
重要 | |
---|---|
要使用加密和解密功能,您需要在JVM中安装完整功能的JCE(默认情况下不包括)。您可以从Oracle 下载“ Java密码学扩展(JCE)无限强度辖区策略文件 ”并按照安装说明进行操作(本质上,您需要用下载的JRE lib / security目录替换这两个策略文件)。 |
如果远程属性源包含加密的内容(以开头的值{cipher}
),则将其解密,然后再通过HTTP发送给客户端。此设置的主要优点是,当属性值处于“ 静止 ”状态时(例如,在git存储库中),不需要使用纯文本格式。如果无法解密一个值,则将其从属性源中删除,并使用相同的键但以前缀invalid
和值表示“ 不适用 ”(通常<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
和/decrypt
终结点(假设它们是安全的,并且只能由授权代理访问)。如果您编辑远程配置文件,则可以使用Config Server通过POST到/encrypt
端点来加密值,如以下示例所示:
$ curl localhost:8888/encrypt -d mysecret
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果您加密的值中包含需要URL编码的字符,则应使用该 |
确保不要在加密值中包含任何curl命令统计信息。将值输出到文件可以帮助避免此问题。 |
反向操作也可以通过以下方式获得/decrypt
(如果服务器配置有对称密钥或完整密钥对),如以下示例所示:
$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret
如果您使用curl进行测试,则使用 |
在将加密的值{cipher}
放入YAML或属性文件中之前,在提交并将其推送到远程(可能不安全)存储之前,请获取加密的值并添加前缀。
该/encrypt
和/decrypt
终点还兼有接受的形式路径/*/{application}/{profiles}
,当客户打电话到主环境资源,这可以用来控制加密的每个应用程序(名称)和每个配置文件的基础。
要以这种精细的方式控制加密,还必须提供一种 |
该spring
命令行客户机(安装弹簧云CLI扩展)也可以用于加密和解密,因为显示在下面的例子:
$ spring encrypt mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret
要使用文件中的密钥(例如用于加密的RSA公钥),请在密钥值前添加“ @”并提供文件路径,如以下示例所示:
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
该 |