原文鏈接:http://www.jianshu.com/p/2927ca2b3719
最近公司準(zhǔn)備做一個(gè)安全級(jí)別比較高的項(xiàng)目:技術(shù)總監(jiān)給我們提出了一個(gè)這樣子的需求:在http請(qǐng)求過(guò)程中,即使嗅探器捕獲到網(wǎng)絡(luò)請(qǐng)求的鏈接也無(wú)法去請(qǐng)求到數(shù)據(jù)。經(jīng)過(guò)一番思考,覺(jué)得支付寶的簽名完全符合這樣子的需求。但是之前自己對(duì)簽名、RSA等知識(shí)也是知道的很少,所以花了一番功夫?qū)W習(xí)了一下。本文將針對(duì)RSA登錄和http請(qǐng)求作講解,希望對(duì)大家有所幫助。
登錄機(jī)制大概可以分為一下三個(gè)階段:
1. 登錄驗(yàn)證:是指客戶端提供用戶名和密碼,向服務(wù)器提出登錄請(qǐng)求,服務(wù)器判斷客戶端是否可以登錄并向客戶端確認(rèn)。2. 登錄保持:是指客戶端登錄后, 服務(wù)器能夠分辨出已登錄的客戶端,并為其持續(xù)提供登錄權(quán)限的服務(wù)器。3. 登出:是指客戶端主動(dòng)退出登錄狀態(tài)。一般的情況是這個(gè)樣子的:一但用戶登陸成功(單方面md5加密:服務(wù)器加密則客戶端不加密,客戶端加密則明文傳輸),服務(wù)器為客戶端分配sessionID(也可以稱為userID),當(dāng)然有些服務(wù)器不但為客戶端分配了userID還有可能會(huì)為用戶提供token了(這個(gè)下面會(huì)做解釋),然后每次網(wǎng)絡(luò)請(qǐng)求都將sessionID當(dāng)做參數(shù)傳遞給服務(wù)器。
能夠保持用戶登錄狀態(tài)、區(qū)分用戶,相對(duì)于不返回任何信息的登錄要安全了一些。
如果通過(guò)網(wǎng)絡(luò)嗅探器(例如:青花瓷)可以獲取到http鏈接,這樣子服務(wù)器返回的sessionID便會(huì)被獲取到,這樣子依然會(huì)造成信息泄露,并且還能被偽造請(qǐng)求(瀏覽器請(qǐng)求)。
第一種存在明顯的安全隱患,但是目前市面上的好多app依然采用第一種方法去實(shí)現(xiàn)登錄、網(wǎng)絡(luò)請(qǐng)求,但是對(duì)于安全級(jí)別較高的app,已經(jīng)不再適用了。所以在此基礎(chǔ)上進(jìn)行優(yōu)化----采用非對(duì)稱加密(公鑰、私鑰)。
客戶端第一次發(fā)出登錄請(qǐng)求時(shí), 用戶密碼以明文的方式傳輸, 一旦被截獲, 后果嚴(yán)重。因此密碼需要加密,例如可采用RSA非對(duì)稱加密。具體流程如下:
客戶端向服務(wù)器第一次發(fā)起登錄請(qǐng)求(不傳輸用戶名和密碼)。服務(wù)器利用RSA算法產(chǎn)生一對(duì)公鑰和私鑰。并保留私鑰, 將公鑰發(fā)送給客戶端。客戶端收到公鑰后, 加密用戶密碼, 向服務(wù)器發(fā)起第二次登錄請(qǐng)求(傳輸用戶名和加密后的密碼)。服務(wù)器利用保留的私鑰對(duì)密文進(jìn)行解密,得到真正的密碼。再仔細(xì)核對(duì)上述登錄流程, 我們發(fā)現(xiàn)服務(wù)器判斷用戶是否登錄, 完全依賴于sessionId, 一旦其被截獲, 黑客就能夠模擬出用戶的請(qǐng)求。于是我們需要引入token的概念: 用戶登錄成功后, 服務(wù)器不但為其分配了sessionId, 還分配了token, token是維持登錄狀態(tài)的關(guān)鍵秘密數(shù)據(jù)。在服務(wù)器向客戶端發(fā)送的token數(shù)據(jù),也需要加密。于是一次登錄的細(xì)節(jié)再次擴(kuò)展。
客戶端向服務(wù)器第一次發(fā)起登錄請(qǐng)求(不傳輸用戶名和密碼)。服務(wù)器利用RSA算法產(chǎn)生一對(duì)公鑰和私鑰。并保留私鑰, 將公鑰發(fā)送給客戶端。客戶端收到公鑰后, 加密用戶密碼,向服務(wù)器發(fā)送用戶名和加密后的用戶密碼; 同時(shí)另外產(chǎn)生一對(duì)公鑰和私鑰,自己保留私鑰, 向服務(wù)器發(fā)送公鑰; 于是第二次登錄請(qǐng)求傳輸了用戶名和加密后的密碼以及客戶端生成的公鑰。服務(wù)器利用保留的私鑰對(duì)密文進(jìn)行解密,得到真正的密碼。 經(jīng)過(guò)判斷, 確定用戶可以登錄后,生成sessionId和token, 同時(shí)利用客戶端發(fā)送的公鑰,對(duì)token進(jìn)行加密。最后將sessionId和加密后的token返還給客戶端。客戶端利用自己生成的私鑰對(duì)token密文解密, 得到真正的token。圖示如下:
 login-300x181.png
login-300x181.png引入token后,http請(qǐng)求被獲取問(wèn)題便可得到解決。 服務(wù)器將token和其它的一些變量, 利用散列加密算法得到簽名后,連同sessionId一并發(fā)送給服務(wù)器; 服務(wù)器取出保存于服務(wù)器端的token,利用相同的法則生成校驗(yàn)簽名, 如果客戶端簽名與服務(wù)器的校驗(yàn)簽名一致, 就認(rèn)為請(qǐng)求來(lái)自登錄的客戶端。(支付寶一樣的機(jī)制)結(jié)構(gòu)圖如下:
 keep_login.png
keep_login.png注:token失效的兩種情況:
1. 用戶登錄出系統(tǒng) 2. token在后臺(tái)的規(guī)定時(shí)間內(nèi)失效(每個(gè)token都是有時(shí)間效應(yīng)的)失效原理:在服務(wù)器端的redis中刪除相應(yīng)key為session的鍵值對(duì)。
散列是信息的提煉,通常其長(zhǎng)度要比信息小得多,且為一個(gè)固定長(zhǎng)度。加密性強(qiáng)的散列一定是不可逆的,這就意味著通過(guò)散列結(jié)果,無(wú)法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將導(dǎo)致散列結(jié)果的明顯變化,這稱之為雪崩效應(yīng)。散列還應(yīng)該是防沖突的,即找不出具有相同散列結(jié)果的兩條信息。具有這些特性的散列結(jié)果就可以用于驗(yàn)證信息是否被修改。
散列算法可以用來(lái)加密token生成簽名, 以便token信息不暴露在網(wǎng)絡(luò)同時(shí)還能驗(yàn)證登錄的有效性。
全寫: Message Digest Algorithm MD5(中文名為消息摘要算法第五版)輸出: 128bit
1、壓縮性:任意長(zhǎng)度的數(shù)據(jù),算出的MD5值長(zhǎng)度都是固定的。2、容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易。3、抗修改性:對(duì)原數(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日的美國(guó)加州圣巴巴拉的國(guó)際密碼學(xué)會(huì)議(Crypto’2004)上,來(lái)自中國(guó)山東大學(xué)的王小云教授做了破譯MD5、HAVAL-128、 MD4和RipEMD算法的報(bào)告,公布了MD系列算法的破解結(jié)果。2009年,馮登國(guó)、謝濤二人利用差分攻擊,將MD5的碰撞算法復(fù)雜度從王小云的2^42進(jìn)一步降低到2^21,極端情況下甚至可以降低至2^10。僅僅2^21的復(fù)雜度意味著即便是在2008年的計(jì)算機(jī)上,也只要幾秒便可以找到一對(duì)碰撞。Md5已老, 在安全性要求較高的場(chǎng)合,不建議使用。
全名: 安全哈希算法(Secure Hash Algorithm)輸出: 160bit與Md5比較相同點(diǎn):因?yàn)槎呔蒑D4導(dǎo)出,SHA-1和MD5彼此很相似。相應(yīng)的,他們的強(qiáng)度和其他特性也是相似。不同點(diǎn):1. 對(duì)強(qiáng)行攻擊的安全性:最顯著和最重要的區(qū)別是SHA-1摘要比MD5摘要長(zhǎng)32 位。使用強(qiáng)行技術(shù),產(chǎn)生任何一個(gè)報(bào)文使其摘要等于給定報(bào)摘要的難度對(duì)MD5是2^128數(shù)量級(jí)的操作,而對(duì)SHA-1則是2^160數(shù)量級(jí)的操作。這樣,SHA-1對(duì)強(qiáng)行攻擊有更大的強(qiáng)度。2. 對(duì)密碼分析的安全性:由于MD5的設(shè)計(jì),易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊。3. 速度:在相同的硬件上,SHA-1的運(yùn)行速度比MD5慢。
所謂加鹽, 就是在原本需要加密的信息基礎(chǔ)上,糅入其它內(nèi)容salt。簽名的生成就是一次加鹽。
本系統(tǒng)使用對(duì)稱加密對(duì)用戶密碼進(jìn)行加密以及生成token字符串。AuthCode加密AuthCode是康盛科技發(fā)明的加密方式, 開(kāi)源產(chǎn)品Discuz的密碼是用這個(gè)算法進(jìn)行加密。但是有點(diǎn)遺憾,這個(gè)函數(shù)所有權(quán)屬于康盛創(chuàng)想,并不能自由使用的。不知使用是否有風(fēng)險(xiǎn)??AES加密高級(jí)加密標(biāo)準(zhǔn)(英語(yǔ):Advanced Encryption Standard,縮寫:AES),在密碼學(xué)中又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。RSA的安全基于大數(shù)分解的難度。其公鑰和私鑰是一對(duì)大素?cái)?shù)(100到200位十進(jìn)制數(shù)或更大)的函數(shù)。從一個(gè)公鑰和密文恢復(fù)出明文的難度,等價(jià)于分解兩個(gè)大素?cái)?shù)之積(這是公認(rèn)的數(shù)學(xué)難題)。算法描述:(1)選擇一對(duì)不同的、足夠大的素?cái)?shù)p,q。(2)計(jì)算n=pq。(3)計(jì)算f(n)=(p-1)(q-1),同時(shí)對(duì)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ù)論中表示同余的符號(hào)。(6)公鑰KU=(e,n),私鑰KR=(d,n)。(7)加密時(shí),先將明文變換成0至n-1的一個(gè)整數(shù)M。若明文較長(zhǎng),可先分割成適當(dāng)?shù)慕M,然后再進(jìn)行交換。設(shè)密文為C,則加密過(guò)程為:

(8)解密過(guò)程為:

。轉(zhuǎn)自:http://blog.csdn.net/m372897500/article/details/50905017 略作了補(bǔ)充
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注