本發(fā)明涉及身份鑒別技術(shù)領(lǐng)域,特別是一種抗口令猜測重放攻擊的身份驗證方法。
背景技術(shù):
隨著計算機技術(shù)和互聯(lián)網(wǎng)技術(shù)的日志發(fā)展和廣泛應(yīng)用,人們越來越強烈地感受到無地域性和實時性的網(wǎng)絡(luò)數(shù)字流正在全方位地改變著信息的傳播方式,使之變得更加快捷、更加高效。但信息安全問題已經(jīng)成為制約計算機網(wǎng)絡(luò)應(yīng)用的一個瓶頸,并且隨著計算機網(wǎng)絡(luò)的迅猛發(fā)展,日益突出。
在當前Web應(yīng)用占主流的趨勢下,身份驗證系統(tǒng)是保護信息安全最重要的部分。用戶名/口令機制占了身份驗證系統(tǒng)實現(xiàn)技術(shù)的絕大多數(shù)。然而,隨著網(wǎng)絡(luò)的高度共享尤其是云計算的蓬勃發(fā)展,對身份驗證系統(tǒng)的攻擊成本越來越低,攻擊者采用廉價的計算資源對身份驗證系統(tǒng)進行暴力的口令猜測重放攻擊非常常見了,如何抵抗此類攻擊是各應(yīng)用開發(fā)商需要面臨的重大問題。
口令猜測的攻擊的成功往往是由于用戶選擇比較簡單好記的弱口令導(dǎo)致的。而口令猜測攻擊的手段多依賴于窮舉手段,勢必經(jīng)過多次嘗試才能成功。因此,目前,抗口令猜測重放攻擊的方法有以下兩種:
1、使用口令生成器生成強度較高的密碼,這時候破解的成本就大大提高以至于在有限時間內(nèi)無法成功,但是強度較高的密碼往往也難以記住,對用戶來說,有可能忘記密碼,也有可能發(fā)生用戶把密碼存儲在其他地方而導(dǎo)致密碼泄露,也不利于信息安全;
2、使用隨機生成的驗證碼,但是這個只適合頁面類的應(yīng)用,對于接口類的應(yīng)用不適用,并且目前的圖像識別技術(shù)也已經(jīng)能在圖片中識別出驗證碼,此類攻擊也能實現(xiàn)自動化;
3、限制錯誤口令連續(xù)嘗試次數(shù),對超出限制的用戶賬號進行鎖定,此種手段可以抵抗口令猜測的攻擊,可是卻引入了另外一個攻擊手段,攻擊者通過猜測用戶名不斷嘗試失敗,可能導(dǎo)致大量用戶賬號被鎖定,大大影響了應(yīng)用的可用性。
技術(shù)實現(xiàn)要素:
本發(fā)明解決的技術(shù)問題在于一種抗口令猜測重放攻擊的身份驗證方法。
本發(fā)明解決上述技術(shù)問題的技術(shù)方案是,
所述的方法包括以下步驟:
步驟1:服務(wù)器與需要身份驗證的用戶瀏覽器分別在互聯(lián)網(wǎng)上進行時間同步,確保兩邊的系統(tǒng)時間保持一致;
步驟2:用戶瀏覽器通過https機制獲取一個共享密鑰;
步驟3:每次需要進行身份驗證前,用戶瀏覽器端獲取當前的時間戳;
步驟4:用戶瀏覽器端使用共享密鑰把用戶名和時間戳一起與密碼進行加密;
步驟5:整個身份驗證信息用共享密鑰再次加密,如下面的構(gòu)造:
加密完成后,用戶瀏覽器把上述信息作為消息體傳送到服務(wù)器端;
步驟6:服務(wù)器端獲得身份驗證信息的密文以后,進行第一次解密,獲得第一份身份驗證信息和一份密文,繼續(xù)對密文進行第二次解密,獲得第二份身份驗證信息;
步驟7:把第一份身份驗證信息和第二份身份驗證信息中的用戶名、時間戳和本次密碼分別進行對比,如果完全一致,那么執(zhí)行步驟8,否則,可能是重放攻擊,執(zhí)行步驟11;
步驟8:把身份驗證信息中的時間戳與當前時間對比,如果超出允許的時間范圍,可能是重放攻擊,執(zhí)行步驟11,否則,執(zhí)行步驟9;
步驟9:驗證信息中的用戶名密碼的組合是否與系統(tǒng)中保存的用戶名密碼組合是否一致,如果一致,那么執(zhí)行步驟10,否則,執(zhí)行步驟11;
步驟10:返回驗證通過的響應(yīng)消息到用戶瀏覽器;
步驟11:返回驗證不通過的響應(yīng)消息到用戶瀏覽器。
所述通過https機制獲取一個共享密鑰指的是獲取網(wǎng)站上使用的數(shù)字證書上的公鑰作為共享密鑰,使用https協(xié)議的網(wǎng)站會向第三方的權(quán)威機構(gòu)申請一個數(shù)字證書,來證明自己的身份,數(shù)字證書中含有一個公鑰,用戶瀏覽器使用這個公鑰對發(fā)送的http請求進行加密,請求到了服務(wù)器端后,再通過網(wǎng)站中的私鑰解密成明文,以達到通信過程加密的謎底。
所述解密指的是使用服務(wù)器本身擁有的對應(yīng)共享密鑰的私鑰對用戶瀏覽器發(fā)送請求中的密文進行解密。
所述時間戳超出允許的時間范圍指的是身份驗證的時間與當前時間的時間差超出允許的時間范圍,本發(fā)明的服務(wù)器只對具有新鮮性的身份驗證信息進行驗證,消息中兩次時間不一致,或構(gòu)造消息中的時間不真實均不對其進行驗證,避免弱密碼經(jīng)過多次口令猜測被破解的問題。
本發(fā)明的方法能產(chǎn)生如下的有益效果:
1、本發(fā)明對口令猜測重放攻擊的抵抗效果不依賴于口令的密碼強度,單獨實施也能實現(xiàn)其效果,是一種適用范圍較廣的技術(shù);
2、本發(fā)明方法能避免由于海量嘗試而可能出現(xiàn)的口令被破解的問題,通過多次猜測方式發(fā)送的身份驗證請求不會被驗證;
3本發(fā)明在常用用戶名/口令驗證機制的基礎(chǔ)上加入時間戳作為唯一的臨時值以對驗證請求進行標識,并且通過加解密方法的應(yīng)用達到抗口令猜測重放攻擊的效果。
附圖說明
下面結(jié)合附圖對本發(fā)明進一步說明:
圖1為本發(fā)明的流程圖;
圖2為本發(fā)明實施的示意圖。
具體實施方式
如圖1、2所示;下面以利用ASP.net提供的固有服務(wù)器控件Login建立用戶登錄頁面Login.aspx進行詳細說明。
Login.aspx的頁面代碼如下:
<%@Page Language=″C#″AutoEventWireup=″true″CodeFile=″Login.aspx.cs″Inherits=″_Default″%>
<!DOCTYPE html PUBLIC″-//W3C//DTD XHTML1.0Transitional//EN″″http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd″>
<html xmlns=″http://www.w3.org/1999/xhtml″>
<head runat=″server″>
<title>Login</title>
</head>
<body>
<form id=″form1″runat=″server″>
<div>
<asp:Login ID=″Login1″runat=″server″Height=″119px″Width=″365px″>
</asp:Login>
</div>
</form>
</body>
</html>
如圖2所示,攻擊過程如下:合法用戶發(fā)送正常的訪問請求到web服務(wù)器,但其通信過程攻擊者監(jiān)聽。之后,攻擊者根據(jù)監(jiān)聽到的身份信息構(gòu)造請求,假冒合法用戶訪問web服務(wù)器。針對上述ASP.net網(wǎng)站,重放攻擊的原理性實施方案如下:
1)用戶輸入web服務(wù)器URL,服務(wù)器響應(yīng)登錄頁Login.aspx;
2)用戶輸入用戶名與密碼,點擊登錄按鈕,認證通過,服務(wù)器返回主頁。
3)假定攻擊者成功監(jiān)聽到用戶瀏覽器的請求,也就是Login.aspx執(zhí)行后的內(nèi)容;
http://Server_IP/aspnetweb/Login.aspx?usemame=admin&password=0FkeIYPa5PfxnLx&authcode=<=LT-35874-05gyEVZu0FkeIYPa5PfxnLxxeYDfsl&execution=e2s1&_eventId=submit&submit=%E3%80%80%E3%80%80%E7%99%BB%E3%80%80%E5%BD%95%E3%80%80%E3%80%80
4)攻擊者可以構(gòu)造合法的請求http請求,并發(fā)送到web服務(wù)器;
5)攻擊者直接進入主頁面,無需輸入用戶名與密碼,享有合法用戶的權(quán)限。攻擊成功。
為了避免在每一個頁面中做認證處理,應(yīng)對方案的實施位置選擇在Forms Authentication Modul.Authenticate事件的處理函數(shù)中,即在Global.aspx文件中加入Forms Authentication_OnAuthenticate事件響應(yīng)函數(shù)。
由于本文提出的應(yīng)對方案是在ASP.net認證框架的基礎(chǔ)上添加會話指紋識別功能實現(xiàn)的,所以,實施方案需要ASP.net自身的認證框架和會話機制的配合。
應(yīng)對方案的關(guān)鍵偽代碼如下:
Phrase=Request.Params[″HTTP_ASPFILTE R SESSIONID″];
SSubstring=Phrase.SubString(S串特征);//用戶名
FSubstring=Phrase.SubString(F串特征);//密碼
if(FSubstring不為空){
Current Session=Application[SSubstring];
if(CurrentSession不為空){
Freshvalue=CurrentSession.datetime();//時間戳
Key=CurrentSession.cert.publicKey;//獲取共享密鑰
ComingRequest=Encry.encry(Key,SSubstring+Freshvalue+FSubstring+Encry.encry(Key,SSubstring+Freshvalue+FSubstring));//加密身份驗證信息
if(!ComingRequest.Equals(CurrentSession)){
authidentity=new CustomFormsIdentity(false);
e.User=new CustomPrincipal(authidentity);
}
}
else{
authidentity=new CustomFormsIdentity(false);
e.User=new CustomPrincipal(authidentity);
}
}
else
{
authidentity=new CustomFormsIdentity(false);
e.User=new CustomPrincipal(authidentity);
}
上述算法用于對服務(wù)器收到的所有請求進行驗證。如果驗證通過,則不做任何處理,即采用ASP.net的認證框架的驗證結(jié)果。如果驗證失敗,則將該請求的身份信息設(shè)置為非認證用戶,需要用戶重新輸入原始的用戶名與密碼進行認證。
利用原始的用戶名與密碼進行認證的偽代碼如下,在Login控件的OnAuthenticate事件響應(yīng)函數(shù)中實施:
protected void on Authenticate(Object sender,AuthenticateEventArgs e){
if(Membership.ValidateUser(Login1.UserName,Login1.Password)){
e.Authenticated=true;
freshvalue=GetDateTime();
Key=Session.cert.publicKey;//獲取共享密鑰
Application[Session.SessionID]=Encry.encry(Key,Login1.UserName+freshvalue+Login1.Password+Encry.encry(Key,Login1.UserName+freshvalue+Login1.Password));
FormsAuthentication.RedirectFromLoginPage(Login1.UserName,false);
}
else{
e.Authenticated=false;
}
}。