本人水平有限,對(duì)密碼學(xué)的理解相當(dāng)淺顯冯袍。錯(cuò)誤與疏漏,歡迎各位指正碾牌。
〇康愤、寫在前面
- 接口安全防護(hù)是個(gè)永恒的話題,提供給前端的接口需要登錄舶吗,提供給服務(wù)的接口(下文簡(jiǎn)稱"三方接口")也需要鑒權(quán)征冷;
- 當(dāng)前大環(huán)境下,
http restful
(甚至不restful)盛行,因?yàn)楹?jiǎn)單誓琼。性能上检激,額...至少比soap webservice好; - 對(duì)于三方接口鑒權(quán)腹侣,規(guī)范的協(xié)議有不少呵扛,比如
OAUTH2
, 但完整的OAUTH2協(xié)議對(duì)客戶端有著苛刻的要求,閹割的OAUTH2協(xié)議看起來好像沒啥用(我個(gè)人這么覺得); - 除了鑒權(quán)筐带,還有一個(gè)難點(diǎn)是防劫持。如果被劫持了缤灵,包括鑒權(quán)在內(nèi)的所有請(qǐng)求都不再可信伦籍;
- 防劫持的唯一可靠措施似乎是
https
蓝晒,然而總有一些網(wǎng)站沒有https,包括一些從來不會(huì)被攻擊帖鸦,但是天天報(bào)漏洞需要修復(fù)的頭疼系統(tǒng)芝薇; - 即使如此,也不能破罐子破摔作儿,多加點(diǎn)防護(hù)洛二,提升點(diǎn)攻擊成本,至少一眼看起來沒啥問題攻锰。這樣就差不多了晾嘶。
一、整體設(shè)計(jì)
1.1 大體思路
- 服務(wù)端維護(hù)客戶服務(wù)列表娶吞,僅提供服務(wù)給已知的客戶端垒迂;
- 客戶端持有兩個(gè)密鑰, 一個(gè)是對(duì)稱加密的密鑰,一個(gè)是非對(duì)稱加密的公鑰妒蛇,兩個(gè)密鑰同時(shí)泄露請(qǐng)打110. 客戶端發(fā)出請(qǐng)求前机断,使用公鑰加密少量信息(例如客戶端標(biāo)識(shí)等),使用對(duì)稱密鑰加密請(qǐng)求體绣夺,最后使用加密后的請(qǐng)求體加鹽(例如兩個(gè)密鑰組合起來)生成摘要吏奸,簽名由非對(duì)稱加密后的字符串拼接摘要組成;
- 服務(wù)端接收到請(qǐng)求后陶耍,查詢客戶服務(wù)列表獲取密鑰等信息奋蔚,對(duì)比摘要后,私鑰解密對(duì)比簽名的剩余部分物臂,最后對(duì)稱解密旺拉。
1.2 詳細(xì)設(shè)計(jì)
1.2.1 服務(wù)屬性
屬性名稱 | 中文釋義 | 備注 |
---|---|---|
clientId | 服務(wù)唯一標(biāo)識(shí) | |
clientSecret | 對(duì)稱密鑰 | |
privateKeyServer | 服務(wù)端私鑰 | 僅服務(wù)端持有 |
publicKeyServer | 服務(wù)端公鑰 |
1.2.2 客戶端處理流程
程序參與方:
- Invoker: 調(diào)用者,即程序引用方;
- RpcEncrypt: 程序入口棵磷;
- Signature: 簽名接口蛾狗,客戶端簽名和服務(wù)端驗(yàn)簽等邏輯在這里實(shí)現(xiàn);
- Digest: 摘要接口,默認(rèn)實(shí)現(xiàn)為HMAC;
- Asymmetric: 非對(duì)稱加密接口仪媒,默認(rèn)實(shí)現(xiàn)為RSA沉桌;
- Symmetric: 對(duì)稱加密接口,默認(rèn)實(shí)現(xiàn)為AES;
- Storage: 存儲(chǔ)接口算吩,默認(rèn)實(shí)現(xiàn)為內(nèi)存留凭。
client_sign.png
1.2.3 服務(wù)端端處理流程
server_validate.png
1.2.4 程序設(shè)計(jì)
UML.png