springcloud~配置中心(xin)~對敏感信(xin)息加(jia)密
簡介
RSA非對(dui)稱加(jia)(jia)密(mi)有(you)著非常強大的(de)(de)(de)(de)(de)(de)安全性(xing),HTTPS的(de)(de)(de)(de)(de)(de)SSL加(jia)(jia)密(mi)就是使用(yong)(yong)(yong)這種(zhong)方法(fa)(fa)進行(xing)(xing)HTTPS請求加(jia)(jia)密(mi)傳輸的(de)(de)(de)(de)(de)(de)。因為RSA算法(fa)(fa)會(hui)涉及Private Key和Public Key分別(bie)用(yong)(yong)(yong)來加(jia)(jia)密(mi)和解(jie)密(mi),所以稱為非對(dui)稱加(jia)(jia)密(mi)。Private Key和Public Key有(you)互操作(zuo)性(xing),即用(yong)(yong)(yong)private key加(jia)(jia)密(mi)的(de)(de)(de)(de)(de)(de)可以用(yong)(yong)(yong)public key解(jie)密(mi),用(yong)(yong)(yong)public key加(jia)(jia)密(mi)的(de)(de)(de)(de)(de)(de)可以用(yong)(yong)(yong)private key解(jie)密(mi)。傳統的(de)(de)(de)(de)(de)(de)單向認證則只用(yong)(yong)(yong)public key進行(xing)(xing)加(jia)(jia)密(mi),有(you)private key的(de)(de)(de)(de)(de)(de)一(yi)方才可進行(xing)(xing)解(jie)密(mi)。例如,一(yi)個web服(fu)(fu)務(wu)器(qi)會(hui)有(you)一(yi)對(dui)private key和public key。瀏覽器(qi)客戶(hu)(hu)端保存(cun)著服(fu)(fu)務(wu)器(qi)的(de)(de)(de)(de)(de)(de)public key。當客戶(hu)(hu)端需要向服(fu)(fu)務(wu)器(qi)發送(song)數(shu)據時(shi),就用(yong)(yong)(yong)服(fu)(fu)務(wu)器(qi)的(de)(de)(de)(de)(de)(de)public key進行(xing)(xing)加(jia)(jia)密(mi),然后服(fu)(fu)務(wu)器(qi)收到數(shu)據時(shi),再用(yong)(yong)(yong)private key進行(xing)(xing)解(jie)密(mi)。客戶(hu)(hu)端驗證服(fu)(fu)務(wu)器(qi)是否為真實的(de)(de)(de)(de)(de)(de)服(fu)(fu)務(wu)器(qi)時(shi),會(hui)根據服(fu)(fu)務(wu)器(qi)提(ti)供的(de)(de)(de)(de)(de)(de)public key和自己本地保存(cun)的(de)(de)(de)(de)(de)(de)public key作(zuo)比較,一(yi)致的(de)(de)(de)(de)(de)(de)話才能驗證服(fu)(fu)務(wu)器(qi)的(de)(de)(de)(de)(de)(de)真實性(xing)。
在我們的config server中,一些(xie)對(dui)加密(mi)要求比較高的可以(yi)采用RSA算法進行數據(ju)的加密(mi)和(he)解(jie)密(mi)
生成測試Keystore
我(wo)們需要使(shi)用jdk自帶的(de)keytool工(gong)具生成一(yi)個keystore,里邊(bian)保存(cun)了private key的(de)信息,使(shi)用如下命令行:
keytool -genkeypair -alias config-server-key -keyalg RSA -dname "CN=Config Server,OU=Xuqian,O=My Own Company,L=Beijing,S=Beijing,C=CN" -keypass changeit -keystore server.jks -storepass changeit
- genkeypair 參數即產生一對public key和private key。
- alias 指定key的別名,用于區分同一keystore中不同的key。
- keyalg 指定生成key的算法,這里使用默認的RSA
- dname 指定common name,即CN,用以驗證key的身份。其中各項皆為自定義參數,OU為單位名稱,O為組織名稱,L為城市,S為省份/州,C為國家
- keypass 為key的密碼
- keystore 為keystore的文件名
- storepass 訪問keystore的密碼
上述工具將產生的 privte key 保存在了名為server.jks的 key store 中。到目前為止,我們只產生了 private key,Spring Cloud Config Server 會根據我們提供的 key 的信息,每次會用程序生成一個 public key,參考如下源代碼org.springframework.security.rsa.crypto.KeyStoreKeyFactory:
這(zhe)里(li)使(shi)用(yong)了 Java Security API 來對key進行操作。參見注釋。然后上邊的信息(xi)通(tong)過 configserver 中的 bootstrap.xml 配置文件(jian)提供:
encrypt:
#key: Thisismysecretkey
key-store:
location: file://${user.home}/development/keys/server.jks
password: changeit
alias: config-server-key
secret: changeit
因為我們不能同時使用對稱加密和非對稱加密,所以我們把 encrypt.key 配置(zhi)注(zhu)釋掉,然后指定非(fei)對稱加密的參數:
- location: Keystore 的文件路徑
- password: keystore 的密碼
- alias: key 的別名
- secret: key的密碼
測試
我(wo)們繼續使用 encrypt API加密一項測(ce)試數據
curl //localhost:8888/encrypt -d lind123
返回加密后的字符:
AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=
然后測試解密
curl //localhost:8888/decrypt -d AQAPWOUOh4+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=
會返回
lind123
應用到項目
添加依賴
implementation('org.springframework.security:spring-security-rsa')
bootstrap.yml內容
user:
password: '{cipher}AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils='
訪問:
返回內容已經解密了
{
"user.password": "23456789"
}