加密與解密
若要使用加密和解密功能,您需要在 JVM 中安裝完整強度的 JCE (預設未包含)。您可以從 Oracle 下載「Java Cryptography Extension (JCE) 無限制強度管轄權原則檔案」,並依照安裝指示進行 (基本上,您需要將 JRE lib/security 目錄中的兩個原則檔案替換為您下載的檔案)。 |
如果遠端屬性來源包含加密內容 (以 {cipher}
開頭的值),則會在透過 HTTP 傳送給用戶端之前解密。此設定的主要優點是,屬性值在「靜止」狀態 (例如,在 git 儲存庫中) 時不需要以純文字格式存在。如果值無法解密,則會從屬性來源中移除,並新增一個具有相同金鑰但以 invalid
為前綴的額外屬性,以及表示「不適用」(通常為 <n/a>
) 的值。這主要是為了防止密文被用作密碼並意外洩露。
如果您為組態用戶端應用程式設定遠端組態儲存庫,則它可能包含類似於以下的 application.yml
spring:
datasource:
username: dbuser
password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
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 引數是強制性的 (即使有 -- 前綴)。 |