摘要: 由于B/S模式下客戶機(jī)對(duì)服務(wù)器的驗(yàn)證困難,提出了使用Remoting程序?qū)W(wǎng)站的真?zhèn)芜M(jìn)行驗(yàn)證。方案實(shí)現(xiàn)了客戶端和服務(wù)器端的相互認(rèn)證、服務(wù)器端敏感信息的安全存儲(chǔ)和每次認(rèn)證產(chǎn)生不同的會(huì)話密鑰,安全分析表明,所提的方案能有效防范釣魚網(wǎng)站等的常見攻擊,增加了系統(tǒng)的安全性。方案使用.NET進(jìn)行實(shí)現(xiàn),證明是可行的。
關(guān)鍵詞: 身份認(rèn)證; 一次性口令; Hash函數(shù); 遠(yuǎn)程訪問(wèn)
中圖分類號(hào):TP309文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1006-8228(2012)04-09-03
Password Authentication System Design Based On .NET Remoting
Fang Jun
(College of International Education, Zhejiang Yuexiu University Of Foreign Languages, Shaoxing, Zhejiang 312000, China)
Abstract: In the condition of the B/S mode, the authentication server is difficult by a client. This paper puts forward to use Remoting program to verify the authenticity of Web site. The program realizes mutual authentication between the client and the server, also realizes server sensitive information safe storage. Every time authentication can produce different session keys. Safety analysis shows that the proposed scheme can effectively prevent phishing against common attack and increase the system security. The scheme is achieved by using .NET, It proved to be feasible.
Key words: Authentication; One-time password; Hash function; Remote access
0 引言
目前所使用的一次性口令認(rèn)證方案大部分都是基于C/S的。一些基于B/S的方案都存在著不驗(yàn)證服務(wù)器真實(shí)性的漏洞。目前國(guó)內(nèi)流行的一次性口令技術(shù)是使用動(dòng)態(tài)口令牌,包括硬件令牌、短信密碼、手機(jī)令牌。這些動(dòng)態(tài)口令牌無(wú)需在PC端安裝軟件,也無(wú)需和PC機(jī)連接,動(dòng)態(tài)口令是根據(jù)專門算法,基于事件同步和基于挑戰(zhàn)/應(yīng)答模式而生成。用這種方式構(gòu)建的安全系統(tǒng)難以抵制釣魚網(wǎng)站的攻擊[1]。隨著因特網(wǎng)應(yīng)用的不斷深入以及電子商務(wù)和網(wǎng)上銀行的發(fā)展和普及,設(shè)計(jì)更加完善的適用于Web應(yīng)用的一次性口令認(rèn)證方案具有重要的意義。
基于Web開發(fā)的系統(tǒng),都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。基于Web的應(yīng)用系統(tǒng),瀏覽器中顯示的內(nèi)容都必須到服務(wù)器下載,因此相對(duì)于C/S的一次性口令認(rèn)證方案來(lái)說(shuō),Web應(yīng)用有其自己的特點(diǎn)。由于B/S模式下客戶機(jī)對(duì)服務(wù)器的驗(yàn)證困難,因此,基于瀏覽器的Web應(yīng)用給網(wǎng)絡(luò)釣魚攻擊者帶來(lái)了可趁之機(jī)。一旦遭受到網(wǎng)絡(luò)釣魚攻擊,則用戶輸入的個(gè)人信息將全部被攻擊者獲取。本文通過(guò)在客戶端安裝一個(gè)簡(jiǎn)單的Remoting程序來(lái)驗(yàn)證網(wǎng)站的真實(shí)性。在確定網(wǎng)站的真實(shí)性之后再輸入密碼,實(shí)現(xiàn)網(wǎng)站對(duì)用戶的認(rèn)證,這樣可以有效地避免口令的泄密。該方案實(shí)現(xiàn)了每次認(rèn)證都會(huì)產(chǎn)生不同的會(huì)話密鑰。
1 符號(hào)約定及方案描述
符號(hào)約定。
ID:用戶的身份標(biāo)識(shí);
PW:用戶口令;
Se:服務(wù)器選擇的種子;
R:隨機(jī)數(shù),其中Ru為客戶端產(chǎn)生的隨機(jī)數(shù),Rs為服務(wù)端產(chǎn)生的隨機(jī)數(shù);
//:聯(lián)結(jié)運(yùn)算符;
⊕:異或運(yùn)算符;
H(x):安全哈希函數(shù),H2(x)對(duì)x連續(xù)進(jìn)行2次哈希運(yùn)算;
U→S:x:客戶端向服務(wù)器端發(fā)送消息x。
方案描述。
本方案包括注冊(cè)和登錄認(rèn)證兩個(gè)階段。
⑴ 注冊(cè)過(guò)程
用戶在安全的環(huán)境下請(qǐng)求注冊(cè),用戶選擇ID、PW,服務(wù)器選擇Se;計(jì)算H(ID)、H2(PW//Se)、Se⊕H(ID,PW)、H(Se//ID//PW),在服務(wù)器端存儲(chǔ)H(ID)、H2(PW//Se)、Se⊕H(ID,PW)、H(Se//ID//PW);客戶端安裝Remoting程序,完成注冊(cè)。
⑵ 認(rèn)證過(guò)程
本方案的身份認(rèn)證過(guò)程如圖1所示。
圖1身份認(rèn)證過(guò)程
① 用戶在頁(yè)面中輸入ID點(diǎn)擊登錄,頁(yè)面中的Javascript代碼計(jì)算H(ID)、Ru和H(ID//Ru),將H(ID//Ru) 保存在客戶端的臨時(shí)文件中。
U→S:H(ID)、H(ID//Ru),認(rèn)證請(qǐng)求。
② 服務(wù)器端查找H(ID),若該H(ID)不存在,服務(wù)器端斷開與客戶端的會(huì)話;否則,服務(wù)器端查找數(shù)據(jù)表中對(duì)應(yīng)的Se⊕H(ID//PW)、H(Se//ID//PW),計(jì)算隨機(jī)數(shù)Rs、C2=Rs⊕H(Se//ID//PW),令C1=Se⊕H(ID//PW),通過(guò)Cookie將C1、C2保存到客戶端,并將H(ID//Ru)保存在服務(wù)器端的臨時(shí)文件中。
③ 用戶在頁(yè)面中點(diǎn)擊按鈕啟動(dòng)客戶端Remoting程序,讀取服務(wù)器端保存的H(ID//Ru)并與客戶端所保存的信息比較,若一致,服務(wù)器為真,彈出提示信息,用戶可以進(jìn)一步輸入口令,同時(shí)刪除客戶端和服務(wù)端的H(ID//Ru)信息;否則,提示用戶不能在頁(yè)面上輸入口令。
④ 用戶在頁(yè)面輸入PW,頁(yè)面中的Javascript代碼計(jì)算H(ID,PW),從客戶端Cookie中讀取C1、C2;計(jì)算Se= C1⊕H(ID,PW),Rs = C2⊕H(Se//ID//PW);計(jì)算認(rèn)證依據(jù)H(PW//Se);
U→S:C3 。C3=Rs⊕H(PW//Se)。
⑤ 服務(wù)器端收到C3后,計(jì)算H(Rs⊕C3),將得到的H2(PW//Se)與服務(wù)器端保存的H2(PW//Se)比較,一致說(shuō)明用戶合法,否則為非法用戶。認(rèn)證過(guò)程結(jié)束。
⑥ 在接下去的服務(wù)器端和客戶端的相互通信中,使用雙方共有的Rs值作為會(huì)話密鑰進(jìn)行加密通信。
2 基于.NET的一次性口令方案的實(shí)現(xiàn)
IC卡認(rèn)證、生物認(rèn)證都需要專用終端認(rèn)證設(shè)備的配合。CA認(rèn)證雖然是目前最好的認(rèn)證方法,但必須以完整的CA體系為基礎(chǔ),需第三方公證,技術(shù)復(fù)雜、成本高,因而應(yīng)用范圍受到很大限制。而一次性口令的優(yōu)點(diǎn)是無(wú)需第三方公證。
2.1 系統(tǒng)環(huán)境與體系結(jié)構(gòu)
系統(tǒng)使用VS2008開發(fā)工具,編程語(yǔ)言使用C#,使用Internet信息服務(wù)器(IIS)作為Web服務(wù)器,客戶端使用IE6.0或更高版本的瀏覽器。
系統(tǒng)采用三層體系結(jié)構(gòu),即表示層、邏輯層、數(shù)據(jù)層,如圖2所示。表示層是為客戶提供應(yīng)用服務(wù)的圖形界面,并提供具有交互功能的用戶操作界面,將用戶向服務(wù)器提交的訪問(wèn)反饋結(jié)果以Web頁(yè)的形式返回給客戶端瀏覽器??蛻舳耸褂昧饲度朐贖TML頁(yè)中的JavaScript代碼實(shí)現(xiàn)Hash運(yùn)算、異或運(yùn)算和隨機(jī)數(shù)的生成。邏輯層處理并封裝了基于Web的應(yīng)用模塊,控制系統(tǒng)的流轉(zhuǎn)。數(shù)據(jù)層負(fù)責(zé)定義、維護(hù)、訪問(wèn)、更新數(shù)據(jù),滿足服務(wù)對(duì)數(shù)據(jù)的請(qǐng)求。
圖2三層結(jié)構(gòu)模型
頁(yè)面間數(shù)據(jù)傳遞使用Querystring 方法,這種方法將要傳遞的數(shù)據(jù)附加在網(wǎng)頁(yè)地址(URL)后面進(jìn)行傳遞。使用Querystring 方法的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,不使用服務(wù)器資源;缺點(diǎn)是傳遞的值會(huì)顯示在瀏覽器的地址欄上。Cookie可以在頁(yè)面之間傳遞少量信息,它存儲(chǔ)在客戶端的文本文件中。
2.2 .NET Remoting技術(shù)概述[2]
在.NET平臺(tái)上,為了使Windows程序運(yùn)行在一個(gè)應(yīng)用程序域中的進(jìn)程與另外一個(gè)應(yīng)用域中的進(jìn)程通信,可以使用Remoting。Remoting是一種分布式編程的技術(shù),主要用于管理跨應(yīng)用程序域的同步和異步RPC會(huì)話。在默認(rèn)情況下,Remoting可使用 HTTP/TCP 協(xié)議進(jìn)行信息通訊,并使用 XML 編碼的SOAP 或二進(jìn)制消息格式進(jìn)行數(shù)據(jù)交換。Remoting 提供了非常靈活和可擴(kuò)展的編程框架,并且可以管理對(duì)象的狀態(tài)。Remoting跟Web服務(wù)不同,它并不依賴于IIS,用戶可以自己開發(fā)并部署宿主服務(wù)器,只需要服務(wù)器支持Framework。.NET Remoting的體系結(jié)構(gòu)如圖3所示。
圖3.NET Remoting體系結(jié)構(gòu)
Remoting程序包括遠(yuǎn)程服務(wù)對(duì)象的創(chuàng)建、主應(yīng)用程序和客戶端應(yīng)用程序。遠(yuǎn)程服務(wù)對(duì)象提供了服務(wù)器端所需的功能,此處實(shí)現(xiàn)的功能是根據(jù)H(ID)讀取服務(wù)器端的H(ID//Ru)。接下來(lái)創(chuàng)建一個(gè)主應(yīng)用程序,其中創(chuàng)建一個(gè)使用端口的HttpChannel對(duì)象,注冊(cè)通道,然后在Remoting平臺(tái)上注冊(cè)遠(yuǎn)程服務(wù)類,最后生成可執(zhí)行文件??蛻舳藨?yīng)用程序是一個(gè)標(biāo)準(zhǔn)的Remoting應(yīng)用程序,主要功能是獲取客戶端臨時(shí)文件中的H(ID//Ru)值;連接遠(yuǎn)程主機(jī),獲取服務(wù)器端的H(ID//Ru),并與客戶端的值比較,若一致,服務(wù)器為真,否則服務(wù)器為假。
2.3 “異或”運(yùn)算
C#程序語(yǔ)言的“異或”運(yùn)算將參數(shù)強(qiáng)制轉(zhuǎn)換為相應(yīng)的數(shù)據(jù)類型(二進(jìn)制),隨后查看兩個(gè)表達(dá)式的二進(jìn)制表示形式的值,并執(zhí)行按位“異或”運(yùn)算。然后再將結(jié)果的二進(jìn)制碼轉(zhuǎn)換回字符。此時(shí),可能會(huì)出現(xiàn)無(wú)法顯示的“控制字符”。因此,本文采用圖4所示步驟進(jìn)行“異或”運(yùn)算,對(duì)字符先進(jìn)行Reed-Solomon編碼[3],再將二進(jìn)制的編碼形式變?yōu)槭M(jìn)制整數(shù),將兩個(gè)十進(jìn)制數(shù)進(jìn)行“異或”運(yùn)算,最后將結(jié)果反變換成字符。
圖4“異或”運(yùn)算示意圖
2.4 Cookie值的讀取
Cookie的格式實(shí)際上是一段純文本信息,由服務(wù)器隨著網(wǎng)頁(yè)一起發(fā)送到客戶端,并保存在客戶端硬盤指定的目錄中??梢允褂们度朐贖TML中的Javascript代碼讀取Cookie值,例如,設(shè)Cookie的值為C1,(C1是包含32個(gè)字符的字符串)則其代碼如下。
var cookieString = new String(document.cookie);
var cookieHeader = "C1=";
//indexOf() 方法可返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置。
var beginPosition = cookieString.indexOf(cookieHeader) ;
if (beginPosition != -1)
{
returnC1 = cookieString.substring(beginPosition+3, beginPosition +35);
}
2.5 登錄界面
本方案基本不改變用戶登錄系統(tǒng)的使用習(xí)慣,只是在用戶輸入密碼前加入驗(yàn)證服務(wù)器的步驟,如果返回驗(yàn)證成功的窗體則用戶可以在頁(yè)面繼續(xù)輸入密碼。該窗口與Windows的三種對(duì)話框是完全不同的,對(duì)話框的用戶界面是腳本編寫者不能修改的,且現(xiàn)在瀏覽器均不支持windows.open()方法的titlebar屬性[2],即該窗體無(wú)法通過(guò)腳本的方式創(chuàng)建,如圖5(c)所示。
(a)(b)(c)
圖5用戶登錄界面和服務(wù)器驗(yàn)證成功時(shí)彈出的提示窗體
點(diǎn)擊頁(yè)面中的“驗(yàn)證服務(wù)器”按鈕,則網(wǎng)頁(yè)中的Javascript代碼即可啟動(dòng)Remoting程序。啟動(dòng)Remoting程序的Javascript代碼如下:
//啟動(dòng)Remoting程序
function exec ()
{
var command=document.getElementsByName("path")[0].value//path為Remoting程序的路徑
var wsh = new ActiveXObject('WScript.Shell');
//創(chuàng)建客戶端程序執(zhí)行對(duì)象
if (wsh) wsh.Run(command);
//調(diào)用Run命令執(zhí)行exe程序,參數(shù)是一個(gè)exe文件的路徑
}
3 安全性分析
重放和小數(shù)攻擊。瀏覽器和服務(wù)器之間傳遞的用于驗(yàn)證的H(PW//Se) 數(shù)據(jù)用隨機(jī)數(shù)Rs“異或”加密保護(hù),每次傳遞的值均不相同。認(rèn)證依據(jù)H(PW//Se) 不在網(wǎng)上直接傳輸,因此本方案能抵御重放攻擊。同時(shí),由于本方案非序列口令,因此本方案可屏蔽小數(shù)攻擊。
冒充(冒充合法用戶)攻擊。當(dāng)攻擊者截獲了用戶登錄時(shí)的信息H(ID),登錄服務(wù)器返回C1、C2值。由于用戶口令不在網(wǎng)上傳輸,也不在任何系統(tǒng)中保存,攻擊者無(wú)法計(jì)算H(ID//PW)獲取Se和Rs,因此,就無(wú)法計(jì)算認(rèn)證依據(jù)H(PW//Se),也無(wú)法從C3獲得該值,冒充失敗。
攻擊者冒充服務(wù)器。用戶登錄假冒的網(wǎng)站后,可能輸入用戶標(biāo)識(shí)ID。此時(shí)用戶啟動(dòng)Remoting程序,該程序?qū)⑴c真實(shí)的服務(wù)器建立通道讀取H(ID//Ru),并從客戶端讀取H(ID//Ru)進(jìn)行比較,但此時(shí)真實(shí)的服務(wù)器端并無(wú)H(ID//Ru)值存在,Remoting程序無(wú)法完成對(duì)網(wǎng)站的驗(yàn)證,攻擊者無(wú)法冒充服務(wù)器。因此本文所提的方案可以有效地防止釣魚網(wǎng)站的攻擊。
如果攻擊者竊聽了認(rèn)證過(guò)程中的C3,攻擊者使服務(wù)器崩潰,則服務(wù)器重啟后恢復(fù)到認(rèn)證前狀態(tài),攻擊者可重放C3登錄系統(tǒng)。但在其后的通信中必須使用會(huì)話密鑰Rs進(jìn)行加密通信,而攻擊者無(wú)法獲得Rs值,而且每次認(rèn)證產(chǎn)生的隨機(jī)數(shù)Rs值不同,通信無(wú)法繼續(xù)。因此本方案可以抵御服務(wù)器崩潰攻擊和會(huì)話劫持攻擊。
在本方案中,口令等敏感數(shù)據(jù),既不在網(wǎng)絡(luò)上傳輸也不存儲(chǔ)于任何地方,服務(wù)器端只存儲(chǔ)認(rèn)證依據(jù)H(PW//Se)的哈希值。由于認(rèn)證過(guò)程中網(wǎng)上傳輸?shù)男畔⒕须S機(jī)數(shù)Ru、Rs參與,沒有明文信息在網(wǎng)絡(luò)上傳輸,并且在合法的通信連接建立以后進(jìn)行加密通信,因此,攻擊者無(wú)法實(shí)施中間人攻擊。
4 結(jié)束語(yǔ)
本文方案使用Remoting程序?qū)崿F(xiàn)了B/S模式下對(duì)網(wǎng)站真?zhèn)蔚蔫b別,每次登錄服務(wù)器時(shí)網(wǎng)上傳輸?shù)恼J(rèn)證值均不同、實(shí)現(xiàn)了客戶和服務(wù)器的雙向認(rèn)證,有效地防止了網(wǎng)絡(luò)釣魚等常見攻擊。本方案的計(jì)算開銷小,只需對(duì)認(rèn)證依據(jù)H(PW//Se)進(jìn)行一次哈希運(yùn)算并與服務(wù)器端的H2(PW//Se)比對(duì);且用戶名和密碼不在系統(tǒng)存儲(chǔ),用戶的身份得到了保護(hù),提高了系統(tǒng)的安全性。由于認(rèn)證時(shí)只進(jìn)行簡(jiǎn)單哈希計(jì)算和“異或”運(yùn)算,避免了目前一些方案在認(rèn)證時(shí)使用的冪指數(shù)運(yùn)算,減少了系統(tǒng)的開銷。
參考文獻(xiàn):
[1] 王貴智.網(wǎng)銀動(dòng)態(tài)口令牌應(yīng)用的安全性[J].中國(guó)金融電腦, 2010.11:29~31
[2] Christian N, Bill E, Jay G著. C# 高級(jí)編程 [M]. 清華大學(xué)出版社,2006.
[3] 方俊, 趙英良. 基于RBF神經(jīng)網(wǎng)絡(luò)的一次性口令認(rèn)證方案[J]. 計(jì)算機(jī)工程,2011.37(9):157~159