Spring Cloud Config RSA簡介及使用RSA加密配置文件的方法
Spring Cloud 為開發(fā)人員提供了一系列的工具來快速構(gòu)建分布式系統(tǒng)的通用模型 。例如:配置管理、服務(wù)發(fā)現(xiàn)、斷路由、智能路由、微代理、控制總線、一次性Token、全局鎖、決策競(jìng)選、分布式session、集群狀態(tài)等等。分布式系統(tǒng)的協(xié)助需要一大堆的模型,使用Spring Cloud開發(fā)者能快速的建立支持實(shí)現(xiàn)這些模式的服務(wù)和應(yīng)用程序。他們將適用于任何分布式環(huán)境,無論是開發(fā)者的個(gè)人電腦還是生產(chǎn)環(huán)境,還是云平臺(tái)。
特性
Spring Cloud 專注于提供良好開箱即用的典型方案和可擴(kuò)展方式。
- 分布式/版本化配置
- 服務(wù)注冊(cè)/服務(wù)發(fā)現(xiàn)
- 路由
- 服務(wù)間調(diào)用
- 負(fù)載均衡
- 斷路器
- 全局鎖
- 領(lǐng)導(dǎo)選取和集群狀態(tài)監(jiān)控
- 分布式消息
簡介
RSA非對(duì)稱加密有著非常強(qiáng)大的安全性,HTTPS的SSL加密就是使用這種方法進(jìn)行HTTPS請(qǐng)求加密傳輸?shù)摹R驗(yàn)镽SA算法會(huì)涉及Private Key和Public Key分別用來加密和解密,所以稱為非對(duì)稱加密。Private Key和Public Key有互操作性,即用private key加密的可以用public key解密,用public key加密的可以用private key解密。傳統(tǒng)的單向認(rèn)證則只用public key進(jìn)行加密,有private key的一方才可進(jìn)行解密。例如,一個(gè)web服務(wù)器會(huì)有一對(duì)private key和public key。瀏覽器客戶端保存著服務(wù)器的public key。當(dāng)客戶端需要向服務(wù)器發(fā)送數(shù)據(jù)時(shí),就用服務(wù)器的public key進(jìn)行加密,然后服務(wù)器收到數(shù)據(jù)時(shí),再用private key進(jìn)行解密。客戶端驗(yàn)證服務(wù)器是否為真實(shí)的服務(wù)器時(shí),會(huì)根據(jù)服務(wù)器提供的public key和自己本地保存的public key作比較,一致的話才能驗(yàn)證服務(wù)器的真實(shí)性。
在我們的config server中,一些對(duì)加密要求比較高的可以采用RSA算法進(jìn)行數(shù)據(jù)的加密和解密。
項(xiàng)目源碼
生成測(cè)試Keystore
我們需要使用jdk自帶的keytool工具生成一個(gè)keystore,里邊保存了private key的信息,使用如下命令行:
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 參數(shù)即產(chǎn)生一對(duì)public key和private key。
-alias 指定key的別名,用于區(qū)分同一keystore中不同的key。
-keyalg 指定生成key的算法,這里使用默認(rèn)的RSA
-dname 指定common name,即CN,用以驗(yàn)證key的身份。其中各項(xiàng)皆為自定義參數(shù),OU為單位名稱,O為組織名稱,L為城市,S為省份/州,C為國家
-keypass 為key的密碼
-keystore 為keystore的文件名
-storepass 訪問keystore的密碼
上述工具將產(chǎn)生的 privte key 保存在了名為server.jks的 key store 中。到目前為止,我們只產(chǎn)生了 private key,Spring Cloud Config Server 會(huì)根據(jù)我們提供的 key 的信息,每次會(huì)用程序生成一個(gè) public key,參考如下源代碼
org.springframework.security.rsa.crypto.KeyStoreKeyFactory:
public KeyPair getKeyPair(String alias, char[] password) {
try {
synchronized (lock) {
if (store == null) {
synchronized (lock) {
// 根據(jù)配置提供的 keystore 文件地址和密碼獲取 keystore 的實(shí)例對(duì)象
store = KeyStore.getInstance("jks");
store.load(resource.getInputStream(), this.password);
}
}
}
// 根據(jù)配置提供的 alias 和 password 從 keystore 中取得 private key
RSAPrivateCrtKey key = (RSAPrivateCrtKey) store.getKey(alias, password);
// 定義 Public Key 生成規(guī)則
RSAPublicKeySpec spec = new RSAPublicKeySpec(key.getModulus(),
key.getPublicExponent());
// 生成 Public Key
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(spec);
return new KeyPair(publicKey, key);
}
catch (Exception e) {
throw new IllegalStateException("Cannot load keys from store: " + resource, e);
}
}
這里使用了 Java Security API 來對(duì)key進(jìn)行操作。參見注釋。然后上邊的信息通過 configserver 中的 bootstrap.xml 配置文件提供:
encrypt:
#key: Thisismysecretkey
key-store:
location: file://${user.home}/development/keys/server.jks
password: changeit
alias: config-server-key
secret: changeit
因?yàn)槲覀儾荒芡瑫r(shí)使用對(duì)稱加密和非對(duì)稱加密,所以我們把 encrypt.key 配置注釋掉,然后指定非對(duì)稱加密的參數(shù):
- location: Keystore 的文件路徑
- password: keystore 的密碼
- alias: key 的別名
- secret: key的密碼
測(cè)試
我們繼續(xù)使用 encrypt API加密一項(xiàng)測(cè)試數(shù)據(jù):
curl http://localhost:8888/encrypt -d 23456789
返回加密后的字符:
AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=
然后測(cè)試解密
curl http://localhost:8888/decrypt -d AQAPWOUOh4+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=
會(huì)返回
23456789
我們還可以修改web-client.yml來驗(yàn)證:
#test:
#password: '{cipher}94c1027141add9844ec47f0be13caebb6b38ed1dcf99811b1a5cd2b874c64407'
user:
password: '{cipher}AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils='
注釋掉 test.password,新增一個(gè) user.password 使用加密后的配置值。然后提交的gitee倉庫,通過 url 訪問此配置文件:
http://localhost:8888/web-client/default
得到如下結(jié)果:
{
"name": "web-client",
"profiles": [
"default"
],
"label": null,
"version": "3044a5345fb86d09a043ca7404b9e57c8c13c512",
"state": null,
"propertySources": [
{
"name": "https://gitee.com/zxuqian/spring-cloud-config-remote/web-client.yml",
"source": {
"message": "此條消息來自于遠(yuǎn)程配置倉庫",
"management.endpoints.web.exposure.include": "*",
"user.password": "23456789"
}
}
]
}
總結(jié)
以上所述是小編給大家介紹的Spring Cloud Config RSA簡介及使用RSA加密配置文件的方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java實(shí)現(xiàn)HTML轉(zhuǎn)為Word的示例代碼
本文以Java代碼為例為大家詳細(xì)介紹如何實(shí)現(xiàn)將HTML文件轉(zhuǎn)為Word文檔(.docx、.doc)。在實(shí)際開發(fā)場(chǎng)景中可參考此方法來轉(zhuǎn)換,感興趣的可以了解一下2022-06-06
springboot中縮短一個(gè)url鏈接的實(shí)現(xiàn)
縮短 URL 是現(xiàn)代應(yīng)用程序中常見的需求,通常用于減少長 URL 的長度,使其更易于分享,URL 縮短服務(wù)的核心思路是將長 URL 映射到一個(gè)唯一的短代碼,本文主要介紹了springboot中縮短一個(gè)url鏈接的實(shí)現(xiàn),感興趣的可以了解一下2024-09-09
淺談java實(shí)現(xiàn)背包算法(0-1背包問題)
本篇文章主要介紹了淺談java實(shí)現(xiàn)背包算法(0-1背包問題) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
Java的項(xiàng)目構(gòu)建工具M(jìn)aven的配置和使用教程
Maven是Java世界中的項(xiàng)目管理和構(gòu)建自動(dòng)化工具,基于POM項(xiàng)目對(duì)象模型的思想,下面我們就具體來看一下具體的Java的項(xiàng)目構(gòu)建工具M(jìn)aven的配置和使用教程:2016-05-05
Java深入分析Iterator迭代器與foreach循環(huán)的使用
這篇文章主要介紹了Java-Iterator迭代器與foreach循環(huán),主要包括Iterator迭代器接口的操作方法和foreach?循環(huán)語法解析,需要的朋友可以參考下2022-05-05
Spring Boot2.0 @ConfigurationProperties使用詳解
這篇文章主要介紹了Spring Boot2.0 @ConfigurationProperties使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
史上最全最強(qiáng)SpringMVC詳細(xì)示例實(shí)戰(zhàn)教程(圖文)
這篇文章主要介紹了史上最全最強(qiáng)SpringMVC詳細(xì)示例實(shí)戰(zhàn)教程(圖文),需要的朋友可以參考下2016-12-12

