徐 軍
( 山東理工大學 計算機科學與技術學院, 山東 淄博 255049)
身份認證處于訪問控制的最前端,是網絡應用系統的首道鑒別防御線。身份認證的主要方法有兩種:一是利用認證依據,主要指主體掌握的秘密,如口令、密鑰等;主體攜帶的物品,如智能卡等;或者是主體獨有的生物特征等。二是基于對稱密碼、公鑰密碼體制的身份認證協議,如Needham-Schroeder 協議等,在這類協議中,示證者能夠向驗證者證明其身份,驗證者并沒有從中獲得任何有用的信息。其中,采用口令作為依據是最經典常用的認證方式[1],也最容易受到破解、攻擊。由于口令注冊、口令存儲、口令更新的成本較高,口令認證并不是一種廉價的方式,研究口令認證仍然很有必要。目前常用的口令認證方案有Lamport 方案、Bellcore方案、時鐘同步方案(Time Synchronized) 、質詢-響應方案(Challenge-Response)、S /KEY 認證方案等,文獻[2-12]都對目前常規口令認證方式進行了分析和一定的改進。其中, 文獻[2]在S/KEY一次性口令認證技術的基礎上,使用隨機串實現服務端和客戶端的雙向認證,同時結合使用AES和RSA加密技術,對注冊數據和認證數據進行加密;文獻[3] 基于單鑰體制使用質詢設計了一個有效的適用于網絡通信系統的身份認證方案,克服了通常的質詢響應認證方案的弱點,能夠防止重放攻擊和冒充攻擊;文獻[4-12]則對S/Key方案進行了不同形式的改進,解決了用戶端與服務器端的雙向認證。目前口令加鹽技術一般在編程中有所應用,但鮮有論述,考慮到對并發、效率要求較高的應用場合,需要設計滿足一定安全等級要求的口令認證系統。
口令身份認證由兩方組成,一方為出示口令者,即web客戶端,提交口令以證明自己與主體相附;另一方為驗證者,即服務器端,負責檢驗口令的正確性和合法性,驗證其是否是其聲稱的主體,然后決定其是否滿足訪問控制的要求。對口令身份認證過程中的可能攻擊有如下3種形式:
1)Sniffer方式,即網絡數據流竊聽。若網絡傳遞的口令信息是未經加密的明文,攻擊者通過竊聽網絡數據,就很容易識別出某種特定系統的數據包,并提取出用戶名和口令。
2)拷貝/重傳,非法用戶截獲口令信息,然后再傳送給接收者,也就是重放攻擊。
3)離線或在線字典攻擊 ,即暴力攻擊。
為抵抗上述3種攻擊形式,口令認證一般不直接傳輸明文口令,而是利用哈希函數的特殊性質來設計方案[3],基本思想是利用散列函數產生口令, 網絡信道傳輸口令的哈希值, 而且口令具有一次性。
早期常規的口令認證方案模型如圖1所示。此方案在編程實踐中經常采用,服務器端不存儲口令明文,明文不會在網上傳輸,并且根據口令摘要也無法推導出口令。認證協議容易設計,口令的修改、更新協議也容易實現。方案的主要缺點為不能抵抗重放攻擊,也不能抵抗窮舉方法的攻擊,比如,查表法(Lookup Tables)。查表法沒有采取字典破解和暴力破解直接方式,而是首先將一些比較常用的密碼的哈希值算好,然后建立一張表,當然密碼越多,這張表就越大。如果獲取某個密碼的哈希值后,只需在建立好的表中查找該哈希值,若匹配,則破解相應密碼。

圖1 常規口令身份認證方案Fig.1 The conventional identity authentication schere
用戶密碼經加密后的哈希值存儲在數據庫中仍然是不夠安全的,為增強安全性,可采取口令加鹽的措施。鹽值(Salt)實質就是一個隨機生成的任意字母、數字或是字母和數字的組合。則認證方案描述為:
第一階段:密碼加鹽
①口令字符串的生成:s=salt+password;
②用哈希函數給口令s加鹽:sk=hash(s);
③服務器端儲存鹽值結果。
第二階段:驗證口令
① 接收用戶提供的帳戶名userid和口令password;
② 在帳戶口令數據庫中檢查userid的合法性,如果合法,則找出其對應的salt,帳戶口令數據庫的基本結構見表1;
表1 帳戶口令數據庫的結構
Tab.1 The structure of account password database

用戶標識加鹽口令鹽 值useridhash(salt,password)salt
③計算加鹽口令信息:s=hash(password,salt);
④ 如果帳戶信息數據庫中存儲的加鹽哈希口令與s相等,則認證成功,否則,認證失敗。
如果口令庫中只存儲hash值,通過查表法(如彩虹表)可以將口令反推出;而通過加鹽技術,由于鹽值是隨機生成的,再采用哈希運算,哈希函數的單向性,能夠有效抵抗查表法攻擊。同時, 加鹽處理使字典攻擊也變得更為困難。
為了實現一次一密,一般采用哈希鏈算法,使每次登錄過程生成的密碼都各不相同,并且在每次登錄過程中加入隨機選定的、采用哈希函數的不確定因子,以提高登錄過程的安全性。系統接收到登錄口令以后, 以同樣的算法做一個驗算即可驗證用戶的合法性。
方案參數設定:初始化口令password和整數n,及一個單向散列函數H,H符合鏈式特征,即對于任意整數r,p1=H(r),p2=H(p1),…,pn+1=H(pn)。
驗證端在登錄口令數據庫中存儲userid、n和pn+1的值;用戶端存儲p1,p2,…,pn序列。
實現過程:
用戶端計算pn=H(password)的值,將userid和pn傳送給服務器,服務器端計算pn+1=H(pn)的值,同服務器上相應的值pn+1進行比較。
若相等,則驗證成功,然后用pn的值取代服務器上pn+1的值,同時,n的值減1。
用戶每次登錄時,都輸入其列表中未取消的最后的數,這樣實現了每次登錄到服務器的口令均不相同,能夠抵抗重放攻擊,也比較容易編程實現。系統需要進行多次Hash運算,方案安全性主要依賴于單向散列函數H的強度,而且用完列表中的數后,需要重新初始化,服務器的額外開銷比較大。
但S/KEY系統無法抵御冒充服務器的攻擊。也就是說,傳統S/KEY系統是只支持服務器對用戶單方面鑒別的認證協議,認證過程中只對用戶進行認證而沒有對服務器進行鑒別,并且 S/KEY 方案并沒有提供對數據的加密,初始化參數及序列都是以明文形式在網絡連接中傳輸。
針對S/KEY方案的小數攻擊的形式[5-8,11],當客戶端向服務器請求認證時,攻擊者截取服務器傳來的種子和迭代值,并修改迭代值為較小值,然后假冒服務器,將得到的種子和較小的迭代值發給用戶。當客戶端利用種子和迭代值計算一次性口令,攻擊者再次中間截取客戶端傳來的一次性口令,并利用已知的單向散列函數,計算較大迭代值的一次性口令, 即可獲得該客戶端后繼的一系列口令,進而完成合法用戶冒充。
文獻[11]通過引入存儲卡、智能卡或者增加時間戳作為驗證因子,對常規S/KEY方案進行改進,基本實現了用戶端與服務器端之間的雙向認證,并實現了對協議關鍵參數和序列數的完整性保護,能夠抵御冒充服務器的小數攻擊,但增加了服務器的運算成本,且關鍵參數需要保存在服務器中。
基于上述分析,若提高認證安全強度,須引入隨機因子,或增加交互次數,本文考慮在身份認證方案中引入質詢—應答技術,并且在口令存儲中采用加鹽技術,以提高系統整體的安全性;同時增加時間戳作為質詢—挑戰驗證因子,通信雙方通過檢驗對方對非重復質詢作出的響應是否正確來實現相互認證,能夠抵御重放攻擊,同時具備對小數攻擊的防范能力,方案未采用 S/KEY 方案中的Hash 鏈方式,以減少服務器端的計算量,提高效率。
質詢—應答方式一般應用于對密鑰、公鑰的身份認證技術,協議相對比較復雜,運算量也較大。本文方案是在一般的口令認證方案中,通過增加質詢環節,采用哈希方法,避免數字簽名、公鑰密碼等運算量較大的算法,盡量減少客戶端、服務端的計算量,也可達到提高安全性的效果,如圖2所示。

圖2 強化安全質詢—挑戰口令認證方案Fig.2 Reinforcing security inquiry-challenge certification Scheme
用戶的主要參數為userid與password,雙方選定共同的哈希函數H,約定使用共同的加密解密算法如DES或AES,加密簡寫為E,解密簡寫為D。
這種模式的主要特點:1)政府主導,整合社會資源,充當引領者、推動者、服務者、監管者等第三方角色,促進鄉村閑置宅的旅游發展;2)經營主體依然是個體農戶;3)農戶收入主要為租金收入、服務收入;4)農戶與農戶之間、農戶與村集體之間關系比較松散。
初始化工作,服務器端的口令數據庫仍采用類似表1 的結構,網上口令注冊時,生成鹽值密碼儲存。
1)用戶端經過哈希運算,形成口令摘要H(password),與userid一起,發送至服務器認證端。
2)服務器端根據userid從口令庫中取出存儲的、匹配的鹽值salt,計算H(salt,password),與存儲值進行比較,若不相等,則認證失敗,否則,轉下一步。
3)服務器端生成時間戳,將其代替質詢隨機數r,將此質詢暫存,然后將此質詢發送給用戶端。
4)用戶端使用第一步的口令散列值H(password)作為密鑰,用約定的加密算法對r進行加密,即t=E(r),E(r)即用戶端對認證端質詢的一個響應,將此響應發送回服務器端。
5)服務器端使用已收到的口令哈希值作為密鑰,對收到的響應t使用D過程進行解密,并與自己選定的隨機數r進行比較,若r=t,則認證通過。
顯然,本方案繼承了常規認證方案的優點,使用了加鹽技術,并引入了時間戳作為質詢,實現了雙向認證,因而能夠抵御字典攻擊、重放攻擊、假冒攻擊和小數攻擊。
時間戳技術的應用,起到兩個作用,一是記錄交互的時間點;二是作為交互的質詢因子,即使非法用戶截獲哈希口令信息,然后再傳送給認證端,入侵者也很難回答認證端的質詢,即使隨機數r被截獲,也難以破譯哈希口令的時間戳,這對攻擊來說是困難的,因而能夠抵御中間重放攻擊。
與前面所述的加鹽方法相比,保留了加鹽技術能夠抵抗字典分析的優點,并且挑戰參數是即時隨機生成的,用完后即可丟掉,不同輪次的質詢之間不存在相關性,因而具有更高的靈活性和安全性。
與其他一次一密技術以及基于公鑰的身份認證協議相比[13-14],本方案服務器端的運算量較小,登錄一次雙方只用到一次加解密運算,主要工作為一次基于哈希運算的交互和兩次基于對稱密碼的交互,簡單易于實現;同時,與文獻[6]中口令認證方案相比,運算量沒有增加,安全性有一定提高。
身份認證方案的安全強度,需要綜合衡量計算成本、存儲成本、操作等因素,比如單純為了抵抗在線字典攻擊,防止機器惡意注冊,可采用圖形碼驗證機制,這方面的做法有很多。本方案只是提供一種綜合安全強度相對較高、編程容易實現、認證效率相對較高的算法,主要不足是依據本方案的口令注冊算法、口令更新算法,交互過程會比較復雜,但難度不大,運算成本也不會很高。