加密與解密

若要使用加密和解密功能,您需要在 JVM 中安裝完整強度的 JCE (預設未包含)。您可以從 Oracle 下載「Java Cryptography Extension (JCE) 無限制強度管轄權原則檔案」,並依照安裝指示進行 (基本上,您需要將 JRE lib/security 目錄中的兩個原則檔案替換為您下載的檔案)。

如果遠端屬性來源包含加密內容 (以 {cipher} 開頭的值),則會在透過 HTTP 傳送給用戶端之前解密。此設定的主要優點是,屬性值在「靜止」狀態 (例如,在 git 儲存庫中) 時不需要以純文字格式存在。如果值無法解密,則會從屬性來源中移除,並新增一個具有相同金鑰但以 invalid 為前綴的額外屬性,以及表示「不適用」(通常為 <n/a>) 的值。這主要是為了防止密文被用作密碼並意外洩露。

如果您為組態用戶端應用程式設定遠端組態儲存庫,則它可能包含類似於以下的 application.yml

application.yml
spring:
  datasource:
    username: dbuser
    password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'

application.properties 檔案中的加密值不得以引號括住。否則,值將不會被解密。以下範例顯示可運作的值

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

您可以安全地將此純文字推送到共用 git 儲存庫,且機密密碼仍受到保護。

伺服器也公開 /encrypt/decrypt 端點 (假設這些端點受到保護且僅由授權代理程式存取)。如果您編輯遠端組態檔案,則可以使用 Config 伺服器透過 POST 傳送到 /encrypt 端點來加密值,如下列範例所示

$ curl localhost:8888/encrypt -s -d mysecret
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果您使用 curl 進行測試,請使用 --data-urlencode (而不是 -d) 並在要加密的值前面加上 = (curl 需要這樣做) 或設定明確的 Content-Type: text/plain,以確保 curl 在有特殊字元時 (特別是 '+') 正確編碼資料。
請務必不要在加密值中包含任何 curl 命令統計資訊,這就是範例使用 -s 選項來使其靜音的原因。將值輸出到檔案有助於避免此問題。

反向操作也可透過 /decrypt 取得 (前提是伺服器已設定對稱金鑰或完整金鑰對),如下列範例所示

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

在將加密值放入 YAML 或 properties 檔案中,以及在您提交並將其推送到遠端 (可能不安全) 儲存區之前,請先加上 {cipher} 前綴。

/encrypt/decrypt 端點也都接受 /*/{application}/{profiles} 形式的路徑,當用戶端呼叫到主要環境資源時,可用於控制每個應用程式 (名稱) 和每個 Profile 的密碼編譯。

若要以這種細微的方式控制密碼編譯,您還必須提供類型為 TextEncryptorLocator@Bean,該 @Bean 會為每個名稱和 Profile 建立不同的加密器。預設提供的加密器不會這樣做 (所有加密都使用相同的金鑰)。

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 引數是強制性的 (即使有 -- 前綴)。