摘要: 由于B/S模式下客戶機(jī)對服務(wù)器的驗(yàn)證困難,提出了使用Remoting程序?qū)W(wǎng)站的真?zhèn)芜M(jìn)行驗(yàn)證。方案實(shí)現(xiàn)了客戶端和服務(wù)器端的相互認(rèn)證、服務(wù)器端敏感信息的安全存儲和每次認(rèn)證產(chǎn)生不同的會(huì)話密鑰,安全分析表明,所提的方案能有效防范釣魚網(wǎng)站等的常見攻擊,增加了系統(tǒng)的安全性。方案使用.NET進(jìn)行實(shí)現(xiàn),證明是可行的。
關(guān)鍵詞: 身份認(rèn)證; 一次性口令; Hash函數(shù); 遠(yuǎn)程訪問
中圖分類號:TP309文獻(xiàn)標(biāo)識碼:A 文章編號: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í)性的漏洞。目前國內(nèi)流行的一次性口令技術(shù)是使用動(dòng)態(tài)口令牌,包括硬件令牌、短信密碼、手機(jī)令牌。這些動(dòng)態(tài)口令牌無需在PC端安裝軟件,也無需和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ù)器下載,因此相對于C/S的一次性口令認(rèn)證方案來說,Web應(yīng)用有其自己的特點(diǎn)。由于B/S模式下客戶機(jī)對服務(wù)器的驗(yàn)證困難,因此,基于瀏覽器的Web應(yīng)用給網(wǎng)絡(luò)釣魚攻擊者帶來了可趁之機(jī)。一旦遭受到網(wǎng)絡(luò)釣魚攻擊,則用戶輸入的個(gè)人信息將全部被攻擊者獲取。本文通過在客戶端安裝一個(gè)簡單的Remoting程序來驗(yàn)證網(wǎng)站的真實(shí)性。在確定網(wǎng)站的真實(shí)性之后再輸入密碼,實(shí)現(xiàn)網(wǎng)站對用戶的認(rèn)證,這樣可以有效地避免口令的泄密。該方案實(shí)現(xiàn)了每次認(rèn)證都會(huì)產(chǎn)生不同的會(huì)話密鑰。
1 符號約定及方案描述
符號約定。
ID:用戶的身份標(biāo)識;
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)對x連續(xù)進(jìn)行2次哈希運(yùn)算;
U→S:x:客戶端向服務(wù)器端發(fā)送消息x。
方案描述。
本方案包括注冊和登錄認(rèn)證兩個(gè)階段。
⑴ 注冊過程
用戶在安全的環(huán)境下請求注冊,用戶選擇ID、PW,服務(wù)器選擇Se;計(jì)算H(ID)、H2(PW//Se)、Se⊕H(ID,PW)、H(Se//ID//PW),在服務(wù)器端存儲H(ID)、H2(PW//Se)、Se⊕H(ID,PW)、H(Se//ID//PW);客戶端安裝Remoting程序,完成注冊。
⑵ 認(rèn)證過程
本方案的身份認(rèn)證過程如圖1所示。
圖1身份認(rèn)證過程
① 用戶在頁面中輸入ID點(diǎn)擊登錄,頁面中的Javascript代碼計(jì)算H(ID)、Ru和H(ID//Ru),將H(ID//Ru) 保存在客戶端的臨時(shí)文件中。
U→S:H(ID)、H(ID//Ru),認(rèn)證請求。
② 服務(wù)器端查找H(ID),若該H(ID)不存在,服務(wù)器端斷開與客戶端的會(huì)話;否則,服務(wù)器端查找數(shù)據(jù)表中對應(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),通過Cookie將C1、C2保存到客戶端,并將H(ID//Ru)保存在服務(wù)器端的臨時(shí)文件中。
③ 用戶在頁面中點(diǎn)擊按鈕啟動(dòng)客戶端Remoting程序,讀取服務(wù)器端保存的H(ID//Ru)并與客戶端所保存的信息比較,若一致,服務(wù)器為真,彈出提示信息,用戶可以進(jìn)一步輸入口令,同時(shí)刪除客戶端和服務(wù)端的H(ID//Ru)信息;否則,提示用戶不能在頁面上輸入口令。
④ 用戶在頁面輸入PW,頁面中的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)比較,一致說明用戶合法,否則為非法用戶。認(rèn)證過程結(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)是無需第三方公證。
2.1 系統(tǒng)環(huán)境與體系結(jié)構(gòu)
系統(tǒng)使用VS2008開發(fā)工具,編程語言使用C#,使用Internet信息服務(wù)器(IIS)作為Web服務(wù)器,客戶端使用IE6.0或更高版本的瀏覽器。
系統(tǒng)采用三層體系結(jié)構(gòu),即表示層、邏輯層、數(shù)據(jù)層,如圖2所示。表示層是為客戶提供應(yīng)用服務(wù)的圖形界面,并提供具有交互功能的用戶操作界面,將用戶向服務(wù)器提交的訪問反饋結(jié)果以Web頁的形式返回給客戶端瀏覽器。客戶端使用了嵌入在HTML頁中的JavaScript代碼實(shí)現(xiàn)Hash運(yùn)算、異或運(yùn)算和隨機(jī)數(shù)的生成。邏輯層處理并封裝了基于Web的應(yīng)用模塊,控制系統(tǒng)的流轉(zhuǎn)。數(shù)據(jù)層負(fù)責(zé)定義、維護(hù)、訪問、更新數(shù)據(jù),滿足服務(wù)對數(shù)據(jù)的請求。
圖2三層結(jié)構(gòu)模型
頁面間數(shù)據(jù)傳遞使用Querystring 方法,這種方法將要傳遞的數(shù)據(jù)附加在網(wǎng)頁地址(URL)后面進(jìn)行傳遞。使用Querystring 方法的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,不使用服務(wù)器資源;缺點(diǎn)是傳遞的值會(huì)顯示在瀏覽器的地址欄上。Cookie可以在頁面之間傳遞少量信息,它存儲在客戶端的文本文件中。
2.2 .NET Remoting技術(shù)概述[2]
在.NET平臺上,為了使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ò)展的編程框架,并且可以管理對象的狀態(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ù)對象的創(chuàng)建、主應(yīng)用程序和客戶端應(yīng)用程序。遠(yuǎn)程服務(wù)對象提供了服務(wù)器端所需的功能,此處實(shí)現(xiàn)的功能是根據(jù)H(ID)讀取服務(wù)器端的H(ID//Ru)。接下來創(chuàng)建一個(gè)主應(yīng)用程序,其中創(chuàng)建一個(gè)使用端口的HttpChannel對象,注冊通道,然后在Remoting平臺上注冊遠(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ù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)無法顯示的“控制字符”。因此,本文采用圖4所示步驟進(jìn)行“異或”運(yùn)算,對字符先進(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)頁一起發(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)證成功的窗體則用戶可以在頁面繼續(xù)輸入密碼。該窗口與Windows的三種對話框是完全不同的,對話框的用戶界面是腳本編寫者不能修改的,且現(xiàn)在瀏覽器均不支持windows.open()方法的titlebar屬性[2],即該窗體無法通過腳本的方式創(chuàng)建,如圖5(c)所示。
(a)(b)(c)
圖5用戶登錄界面和服務(wù)器驗(yàn)證成功時(shí)彈出的提示窗體
點(diǎn)擊頁面中的“驗(yàn)證服務(wù)器”按鈕,則網(wǎng)頁中的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í)行對象
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)中保存,攻擊者無法計(jì)算H(ID//PW)獲取Se和Rs,因此,就無法計(jì)算認(rèn)證依據(jù)H(PW//Se),也無法從C3獲得該值,冒充失敗。
攻擊者冒充服務(wù)器。用戶登錄假冒的網(wǎng)站后,可能輸入用戶標(biāo)識ID。此時(shí)用戶啟動(dòng)Remoting程序,該程序?qū)⑴c真實(shí)的服務(wù)器建立通道讀取H(ID//Ru),并從客戶端讀取H(ID//Ru)進(jìn)行比較,但此時(shí)真實(shí)的服務(wù)器端并無H(ID//Ru)值存在,Remoting程序無法完成對網(wǎng)站的驗(yàn)證,攻擊者無法冒充服務(wù)器。因此本文所提的方案可以有效地防止釣魚網(wǎng)站的攻擊。
如果攻擊者竊聽了認(rèn)證過程中的C3,攻擊者使服務(wù)器崩潰,則服務(wù)器重啟后恢復(fù)到認(rèn)證前狀態(tài),攻擊者可重放C3登錄系統(tǒng)。但在其后的通信中必須使用會(huì)話密鑰Rs進(jìn)行加密通信,而攻擊者無法獲得Rs值,而且每次認(rèn)證產(chǎn)生的隨機(jī)數(shù)Rs值不同,通信無法繼續(xù)。因此本方案可以抵御服務(wù)器崩潰攻擊和會(huì)話劫持攻擊。
在本方案中,口令等敏感數(shù)據(jù),既不在網(wǎng)絡(luò)上傳輸也不存儲于任何地方,服務(wù)器端只存儲認(rèn)證依據(jù)H(PW//Se)的哈希值。由于認(rèn)證過程中網(wǎng)上傳輸?shù)男畔⒕须S機(jī)數(shù)Ru、Rs參與,沒有明文信息在網(wǎng)絡(luò)上傳輸,并且在合法的通信連接建立以后進(jìn)行加密通信,因此,攻擊者無法實(shí)施中間人攻擊。
4 結(jié)束語
本文方案使用Remoting程序?qū)崿F(xiàn)了B/S模式下對網(wǎng)站真?zhèn)蔚蔫b別,每次登錄服務(wù)器時(shí)網(wǎng)上傳輸?shù)恼J(rèn)證值均不同、實(shí)現(xiàn)了客戶和服務(wù)器的雙向認(rèn)證,有效地防止了網(wǎng)絡(luò)釣魚等常見攻擊。本方案的計(jì)算開銷小,只需對認(rèn)證依據(jù)H(PW//Se)進(jìn)行一次哈希運(yùn)算并與服務(wù)器端的H2(PW//Se)比對;且用戶名和密碼不在系統(tǒng)存儲,用戶的身份得到了保護(hù),提高了系統(tǒng)的安全性。由于認(rèn)證時(shí)只進(jìn)行簡單哈希計(jì)算和“異或”運(yùn)算,避免了目前一些方案在認(rèn)證時(shí)使用的冪指數(shù)運(yùn)算,減少了系統(tǒng)的開銷。
參考文獻(xiàn):
[1] 王貴智.網(wǎng)銀動(dòng)態(tài)口令牌應(yīng)用的安全性[J].中國金融電腦, 2010.11:29~31
[2] Christian N, Bill E, Jay G著. C# 高級編程 [M]. 清華大學(xué)出版社,2006.
[3] 方俊, 趙英良. 基于RBF神經(jīng)網(wǎng)絡(luò)的一次性口令認(rèn)證方案[J]. 計(jì)算機(jī)工程,2011.37(9):157~159