SpringCloud 加密和解密
重要:
要使用加密和解密功能,您需要在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
使用--data-urlencode
选项以确保它们正确编码。
确保不要在加密值中包含任何curl命令统计信息。将值输出到文件可以帮助避免此问题。
也可以通过/decrypt
使用反向操作(前提是服务器配置了对称密钥或完整密钥对),如以下示例所示:
$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
如果使用curl进行测试,请使用
--data-urlencode
(而不是-d
)或设置显式的Content-Type: text/plain
以确保在有特殊字符时,curl可以正确编码数据(“ +”特别棘手)。
在将加密的值放入YAML或属性文件之前,以及将其提交并将其推送到远程(可能不安全)存储之前,请获取加密的值并添加{cipher}
前缀。
/encrypt
和/decrypt
端点也都接受/*/{application}/{profiles}
形式的路径,当客户端调用主应用程序时,可用于按应用程序(名称)和配置文件控制密码。环境资源。
要以这种精细的方式控制密码,您还必须提供类型为
TextEncryptorLocator
的@Bean
,以按名称和配置文件创建不同的加密器。默认情况下不提供(所有加密使用相同的密钥)。
spring
命令行客户端(安装了Spring Cloud 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+...
--key
参数是强制性的(尽管前缀为--
)。
更多建议: