摘要
最近公司準(zhǔn)備做一個(gè)安全級別比較高的項(xiàng)目:技術(shù)總監(jiān)給我們提出了一個(gè)這樣子的需求:在http請求過程中搏屑,即使嗅探器捕獲到網(wǎng)絡(luò)請求的鏈接也無法去請求到數(shù)據(jù)。經(jīng)過一番思考粉楚,覺得支付寶的簽名完全符合這樣子的需求。但是之前自己對簽名亮垫、RSA等知識也是知道的很少模软,所以花了一番功夫?qū)W習(xí)了一下。本文將針對RSA登錄和http請求作講解饮潦,希望對大家有所幫助燃异。
一.登錄、登錄保持(http請求)
登錄機(jī)制
登錄機(jī)制大概可以分為一下三個(gè)階段:
1. 登錄驗(yàn)證:是指客戶端提供用戶名和密碼继蜡,向服務(wù)器提出登錄請求回俐,服務(wù)器判斷客戶端是否可以登錄并向客戶端確認(rèn)。
2. 登錄保持:是指客戶端登錄后稀并, 服務(wù)器能夠分辨出已登錄的客戶端仅颇,并為其持續(xù)提供登錄權(quán)限的服務(wù)器。
3. 登出:是指客戶端主動(dòng)退出登錄狀態(tài)碘举。
第一種網(wǎng)絡(luò)請求情況(安全級別:II)
一般的情況是這個(gè)樣子的:一但用戶登陸成功(單方面MD5加密:服務(wù)器加密則客戶端不加密忘瓦,客戶端加密則明文傳輸),服務(wù)器為客戶端分配sessionID(也可以稱為userID),當(dāng)然有些服務(wù)器不但為客戶端分配了userID還有可能會為用戶提供token了(這個(gè)下面會做解釋)引颈,然后每次網(wǎng)絡(luò)請求都將sessionID當(dāng)做參數(shù)傳遞給服務(wù)器耕皮。
優(yōu)點(diǎn)
能夠保持用戶登錄狀態(tài)、區(qū)分用戶蝙场,相對于不返回任何信息的登錄要安全了一些凌停。
缺點(diǎn)
如果通過網(wǎng)絡(luò)嗅探器(例如:青花瓷)可以獲取到http鏈接,這樣子服務(wù)器返回的sessionID便會被獲取到售滤,這樣子依然會造成信息泄露罚拟,并且還能被偽造請求(瀏覽器請求)。
第二種網(wǎng)絡(luò)請求情況 (安全級別:III)
第一種存在明顯的安全隱患,但是目前市面上的好多app依然采用第一種方法去實(shí)現(xiàn)登錄舟舒、網(wǎng)絡(luò)請求拉庶,但是對于安全級別較高的app,已經(jīng)不再適用了秃励。所以在此基礎(chǔ)上進(jìn)行優(yōu)化----采用非對稱加密(公鑰氏仗、私鑰)。
登錄模型
客戶端第一次發(fā)出登錄請求時(shí)夺鲜, 用戶密碼以明文的方式傳輸皆尔, 一旦被截獲, 后果嚴(yán)重币励。因此密碼需要加密慷蠕,例如可采用RSA非對稱加密。具體流程如下:
- 客戶端向服務(wù)器第一次發(fā)起登錄請求(不傳輸用戶名和密碼)食呻。
- 服務(wù)器利用RSA算法產(chǎn)生一對公鑰和私鑰流炕。并保留私鑰, 將公鑰發(fā)送給客戶端仅胞。
- 客戶端收到公鑰后每辟, 加密用戶密碼, 向服務(wù)器發(fā)起第二次登錄請求(傳輸用戶名和加密后的密碼)干旧。
- 服務(wù)器利用保留的私鑰對密文進(jìn)行解密渠欺,得到真正的密碼。
第三種網(wǎng)絡(luò)請求情況(安全級別:IIII)
再仔細(xì)核對上述登錄流程椎眯, 我們發(fā)現(xiàn)服務(wù)器判斷用戶是否登錄挠将, 完全依賴于sessionId, 一旦其被截獲, 黑客就能夠模擬出用戶的請求编整。于是我們需要引入token的概念: 用戶登錄成功后舔稀, 服務(wù)器不但為其分配了sessionId, 還分配了token, token是維持登錄狀態(tài)的關(guān)鍵秘密數(shù)據(jù)掌测。在服務(wù)器向客戶端發(fā)送的token數(shù)據(jù)镶蹋,也需要加密。于是一次登錄的細(xì)節(jié)再次擴(kuò)展赏半。
- 客戶端向服務(wù)器第一次發(fā)起登錄請求(不傳輸用戶名和密碼)贺归。
服務(wù)器利用RSA算法產(chǎn)生一對公鑰和私鑰。并保留私鑰断箫, 將公鑰發(fā)送給客戶端拂酣。 - 客戶端收到公鑰后, 加密用戶密碼仲义,向服務(wù)器發(fā)送用戶名和加密后的用戶密碼婶熬; 同時(shí)另外產(chǎn)生一對公鑰和私鑰剑勾,自己保留私鑰, 向服務(wù)器發(fā)送公鑰; 于是第二次登錄請求傳輸了用戶名和加密后的密碼以及客戶端生成的公鑰赵颅。
- 服務(wù)器利用保留的私鑰對密文進(jìn)行解密虽另,得到真正的密碼。 經(jīng)過判斷饺谬, 確定用戶可以登錄后捂刺,生成sessionId和token, 同時(shí)利用客戶端發(fā)送的公鑰募寨,對token進(jìn)行加密族展。最后將sessionId和加密后的token返還給客戶端。
-
客戶端利用自己生成的私鑰對token密文解密拔鹰, 得到真正的token仪缸。
圖示如下:
登錄保持(也就是http數(shù)據(jù)請求階段)
引入token后,http請求被獲取問題便可得到解決列肢。 服務(wù)器將token和其它的一些變量恰画, 利用散列加密算法得到簽名后,連同sessionId一并發(fā)送給服務(wù)器瓷马; 服務(wù)器取出保存于服務(wù)器端的token,利用相同的法則生成校驗(yàn)簽名拴还, 如果客戶端簽名與服務(wù)器的校驗(yàn)簽名一致, 就認(rèn)為請求來自登錄的客戶端决采。(支付寶一樣的機(jī)制)
結(jié)構(gòu)圖如下:
注:token失效的兩種情況:
1. 用戶登錄出系統(tǒng)
2. token在后臺的規(guī)定時(shí)間內(nèi)失效(每個(gè)token都是有時(shí)間效應(yīng)的)
失效原理:
在服務(wù)器端的redis中刪除相應(yīng)key為session的鍵值對。
二.散列算法
散列是信息的提煉坟奥,通常其長度要比信息小得多树瞭,且為一個(gè)固定長度。加密性強(qiáng)的散列一定是不可逆的爱谁,這就意味著通過散列結(jié)果晒喷,無法推出任何部分的原始信息。任何輸入信息的變化访敌,哪怕僅一位凉敲,都將導(dǎo)致散列結(jié)果的明顯變化,這稱之為雪崩效應(yīng)寺旺。散列還應(yīng)該是防沖突的爷抓,即找不出具有相同散列結(jié)果的兩條信息。具有這些特性的散列結(jié)果就可以用于驗(yàn)證信息是否被修改阻塑。
散列算法可以用來加密token生成簽名蓝撇, 以便token信息不暴露在網(wǎng)絡(luò)同時(shí)還能驗(yàn)證登錄的有效性。
MD5
全寫: Message Digest Algorithm MD5(中文名為消息摘要算法第五版)
輸出: 128bit
MD5算法具有以下特點(diǎn):
1陈莽、壓縮性:任意長度的數(shù)據(jù)渤昌,算出的MD5值長度都是固定的虽抄。
2、容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易独柑。
3迈窟、抗修改性:對原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改1個(gè)字節(jié)忌栅,所得到的MD5值都有很大區(qū)別车酣。
4、弱抗碰撞:已知原數(shù)據(jù)和其MD5值狂秘,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的骇径。
5、強(qiáng)抗碰撞:想找到兩個(gè)不同的數(shù)據(jù)者春,使它們具有相同的MD5值破衔,是非常困難的。
缺陷:Md5一度被認(rèn)為十分靠譜钱烟。2004年8月17日的美國加州圣巴巴拉的國際密碼學(xué)會議(Crypto’2004)上晰筛,來自中國山東大學(xué)的王小云教授做了破譯MD5、HAVAL-128拴袭、 MD4和RIPEMD算法的報(bào)告读第,公布了MD系列算法的破解結(jié)果。2009年拥刻,馮登國怜瞒、謝濤二人利用差分攻擊,將MD5的碰撞算法復(fù)雜度從王小云的242進(jìn)一步降低到221般哼,極端情況下甚至可以降低至210吴汪。僅僅221的復(fù)雜度意味著即便是在2008年的計(jì)算機(jī)上,也只要幾秒便可以找到一對碰撞蒸眠。Md5已老漾橙, 在安全性要求較高的場合,不建議使用楞卡。
SHA1
全名: 安全哈希算法(Secure Hash Algorithm)輸出: 160bit
與Md5比較
相同點(diǎn):因?yàn)槎呔蒑D4導(dǎo)出霜运,SHA-1和MD5彼此很相似。相應(yīng)的蒋腮,他們的強(qiáng)度和其他特性也是相似淘捡。不同點(diǎn):1. 對強(qiáng)行攻擊的安全性:最顯著和最重要的區(qū)別是SHA-1摘要比MD5摘要長32 位。使用強(qiáng)行技術(shù)池摧,產(chǎn)生任何一個(gè)報(bào)文使其摘要等于給定報(bào)摘要的難度對MD5是2128數(shù)量級的操作案淋,而對SHA-1則是2160數(shù)量級的操作。這樣险绘,SHA-1對強(qiáng)行攻擊有更大的強(qiáng)度踢京。2. 對密碼分析的安全性:由于MD5的設(shè)計(jì)誉碴,易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊瓣距。3. 速度:在相同的硬件上黔帕,SHA-1的運(yùn)行速度比MD5慢。
加鹽
所謂加鹽蹈丸, 就是在原本需要加密的信息基礎(chǔ)上成黄,糅入其它內(nèi)容salt。簽名的生成就是一次加鹽逻杖。
對稱加密
本系統(tǒng)使用對稱加密對用戶密碼進(jìn)行加密以及生成token字符串奋岁。
AuthCode加密
AuthCode是康盛科技發(fā)明的加密方式, 開源產(chǎn)品Discuz的密碼是用這個(gè)算法進(jìn)行加密荸百。但是有點(diǎn)遺憾闻伶,這個(gè)函數(shù)所有權(quán)屬于康盛創(chuàng)想,并不能自由使用的够话。不知使用是否有風(fēng)險(xiǎn)蓝翰??
AES加密
高級加密標(biāo)準(zhǔn)(英語:Advanced Encryption Standard女嘲,縮寫:AES)畜份,在密碼學(xué)中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)欣尼。這個(gè)標(biāo)準(zhǔn)用來替代原先的DES爆雹,已經(jīng)被多方分析且廣為全世界所使用。
非對稱加密
RSA是目前最有影響力的公鑰加密算法愕鼓,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊钙态,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。RSA的安全基于大數(shù)分解的難度拒啰。其公鑰和私鑰是一對大素?cái)?shù)(100到200位十進(jìn)制數(shù)或更大)的函數(shù)驯绎。從一個(gè)公鑰和密文恢復(fù)出明文的難度完慧,等價(jià)于分解兩個(gè)大素?cái)?shù)之積(這是公認(rèn)的數(shù)學(xué)難題)谋旦。
算法描述:
(1)選擇一對不同的、足夠大的素?cái)?shù)p屈尼,q册着。
(2)計(jì)算n=pq。
(3)計(jì)算f(n)=(p-1)(q-1)脾歧,同時(shí)對p, q嚴(yán)加保密甲捏,不讓任何人知道。
(4)找一個(gè)與f(n)互質(zhì)的數(shù)e(公鑰指數(shù))鞭执,且1<e<f(n)司顿。
(5)計(jì)算d(私鑰指數(shù))芒粹,使得de≡1 mod f(n)。這個(gè)公式也可以表達(dá)為d ≡e-1 mod f(n)注大溜,≡是數(shù)論中表示同余的符號化漆。
(6)公鑰KU=(e,n),私鑰KR=(d,n)钦奋。
(7)加密時(shí)座云,先將明文變換成0至n-1的一個(gè)整數(shù)M。若明文較長付材,可先分割成適當(dāng)?shù)慕M朦拖,然后再進(jìn)行交換。設(shè)密文為C厌衔,則加密過程為:
(8)解密過程為:
轉(zhuǎn)自:http://blog.csdn.net/m372897500/article/details/50905017 略作了補(bǔ)充
歡迎關(guān)注我的個(gè)人微信公眾號,免費(fèi)送計(jì)算機(jī)各種最新視頻資源葵诈!你想象不到的精彩裸弦!