◆徐 軍
?
基于口令的攻擊分析與防御設(shè)計
◆徐 軍
(山東理工大學(xué)計算機科學(xué)與技術(shù)學(xué)院 山東 255049)
使用口令的目的是為了對用戶進行認(rèn)證,防止各種攻擊及非法登錄行為。為了抵抗暴力攻擊、字典攻擊、彩虹表攻擊、中間假冒攻擊等手段,對口令認(rèn)證的原理以及使用的關(guān)鍵技術(shù)進行了綜述分析,在此基礎(chǔ)之上,利用哈希技術(shù)、加鹽技術(shù)和慢哈希技術(shù)設(shè)計了一個簡單有效、易于編程實現(xiàn)的口令認(rèn)證方案,方案計算量可調(diào)控,安全強度較高,能抵抗一般常見形式的網(wǎng)絡(luò)攻擊。
口令認(rèn)證;哈希;加鹽;慢哈希;攻擊
口令認(rèn)證是最常用的方法,我們無論登錄什么系統(tǒng)都要用到賬戶與密碼,現(xiàn)實中web系統(tǒng)面臨許多的威脅,而對口令的攻擊是手段和目的最直接的攻擊,取得口令即可實現(xiàn)入侵。同時,服務(wù)器端的口令數(shù)據(jù)庫也是網(wǎng)絡(luò)入侵的高價值目標(biāo)。在編程實踐與相關(guān)教學(xué)中,看似簡單的口令技術(shù),我們發(fā)現(xiàn)大量偏差的理解與錯誤的用法,本研究試圖對口令攻擊、防御技術(shù)給出系統(tǒng)化的、全面的分析,并提出口令加固的方法、方案,以提高口令認(rèn)證的應(yīng)用水平。
一般,口令認(rèn)證基于客戶機/服務(wù)器(C/S)模式??蛻舳颂峤毁~戶、口令,經(jīng)網(wǎng)絡(luò)傳輸至服務(wù)器端進行認(rèn)證。主要的威脅關(guān)鍵點有兩個,一在網(wǎng)絡(luò)傳輸過程,要防止竊聽;二是服務(wù)器端口令的存儲,不能泄露口令的明文,甚至要在網(wǎng)站被入侵,口令被“拖庫”的情況下,也要保證口令不能被破解。
務(wù)器端的口令數(shù)據(jù)庫不能存儲明文的口令,口令在服務(wù)器端的存儲形式?jīng)Q定了采用什么樣的安全技術(shù)與認(rèn)證方案。將口令變換的技術(shù)稱為哈希技術(shù)。表1為服務(wù)器端常見的簡單存儲結(jié)構(gòu),只包含兩個字段:username 、passwordhashvalue,passwordhashvalue采用公開常規(guī)MD5工具計算得出,其對應(yīng)的明文口令值為(“20180602”, “Dia-loutes”, “My love”)。
表1 服務(wù)器端口令存儲結(jié)構(gòu)
基于口令認(rèn)證的關(guān)鍵技術(shù)主要包括哈希函數(shù)、口令加鹽技術(shù)公鑰密碼技術(shù)等,實際的認(rèn)證方案是幾種技術(shù)的綜合運用。
哈希函數(shù)是一種人為設(shè)計性質(zhì)特殊的函數(shù),一般用來實現(xiàn)保密、認(rèn)證和消息完整性保護,也是安全認(rèn)證協(xié)議、數(shù)字簽名算法的重要組成部分。
Hash函數(shù)H具備以下幾個基本特性:
(1)輸入x可以為任意長度;輸出數(shù)據(jù)串長度固定,128bit或256bit;
(2)單向性,正向計算實現(xiàn)容易,即給定任何x,容易算出H(x);而反向計算實現(xiàn)困難,即給出一Hash值h,很難找出一特定輸入x,使h=H(x);
(3)抗沖突碰撞性,即對于任意兩條消息x、y,使得H(x)=H(y)在計算上是不可行的;
函數(shù)單向性決定了即使取得口令的哈希值也不可能從中恢復(fù)出口令, 因此能應(yīng)對網(wǎng)絡(luò)竊聽,網(wǎng)站內(nèi)部人員也看不能明文口令,能防止一般的字典攻擊和暴力破解(Dictionary and Brute Force Attacks)。
ash函數(shù)安全性是不夠的,破解Hash的原理是,對于給出的一個y,反算出一個x來滿足y = H(x),因其直接計算是不可能的,目前一般采用查表法,即設(shè)計一個大型字典表,記錄下盡可能多的x與y的對應(yīng)關(guān)系,直接查表匹配。
瑞典的Philippe Oechslin在2003年提出了一種高效破解windows開機密碼的時空折中算法[1],這就是“彩虹表Rainbow”技術(shù),主要針對破解Windows Xp開機認(rèn)證的LM-HASH算法。根據(jù)這個原理,同樣可以用于破解SHA、MD5等算法。
該算法的原理是預(yù)先計算得到一個較大的表,對于一個給定的hash值,在表內(nèi)進行查找,破譯速度快,效率高。彩虹表的核心是精心設(shè)計的R函數(shù),該函數(shù)的定義域是hash函數(shù)的值域,值域是合理的輸入域,R函數(shù)使用哈希鏈方法計算各哈希值的與之對應(yīng)值,并進行儲存,查表時根據(jù)哈希值從頭節(jié)點開始做H、R交替運算,直到某個hash值和給定hash值相等,或者找到尾節(jié)點,就會得到一個與用戶輸入等價的密碼。[2]提供了針對LM、NTLM、MD5、SHA1等常用算法的彩虹表下載。
防御彩虹表攻擊,最好用的方法就是加鹽(salt)?!胞}”的實質(zhì)就是一個具有一定長度的隨機數(shù)串,加鹽的結(jié)果使密碼更長,強度更高,使彩虹表逆推的難度也更大,使用攻擊手段進行撞庫時運算量更大,破解的難度更高。
基本加鹽過程:
圖1 口令加鹽過程
加鹽算法后,服務(wù)器端的存儲結(jié)構(gòu)變?yōu)楸?的形式:
表2 加鹽哈希表
這里,服務(wù)器端存儲的其實是H(password)+salt value。在登錄界面,客戶端程序要與服務(wù)器端協(xié)商一個鹽值數(shù)據(jù),同時與密碼的哈希值結(jié)合,傳輸給服務(wù)器端驗證,網(wǎng)絡(luò)信道傳輸?shù)氖莾?nèi)容是H(password+salt)或者H(H(password)+salt),這樣,攻擊者即使通過彩虹表找到了特定hash值對應(yīng)的密碼,也無法得到用戶輸入的密碼,甚至根本得不到密碼。如果攻擊者獲得鹽值以及其位置,破解時也需要對R函數(shù)重新設(shè)計修改,因此已有的彩虹表數(shù)據(jù)就會完全失去作用。
存儲鹽值明文會降低安全性,實際編程時,一般要采取不同的加鹽方案。文獻(xiàn)[3]中采用了偽隨機數(shù)生成器的加鹽哈希算法,大大增強了口令認(rèn)證安全性。
如果知道加鹽的方式或鹽值泄露,攻擊者通過重新構(gòu)造彩虹表或者暴力遍歷就能夠?qū)崿F(xiàn)破解,所以加鹽技術(shù)方案需要遵循幾個基本原則:
(1)靜態(tài)不變的salt、明文存儲的salt不能使用。
(2)salt 要具有一定的安全長度。
(3)salt最好是隨機的,由服務(wù)端的隨機函數(shù)生成。
(4)服務(wù)器不能存儲用戶口令加鹽的hash結(jié)果。
(5)salt庫和口令密碼庫盡量分離開存放。
加入干擾項后使攻擊者無法采用特定的查詢表和彩虹表快速破解大量哈希值,但是卻不能防止最原始的字典攻擊或暴力攻擊。攻擊者可在web前端大量嘗試各種密碼可能,在高速強大的計算能力面前,哈希函數(shù)顯得很脆弱,為了應(yīng)對這種對密碼的字典攻擊或暴力攻擊,可以采取慢哈希技術(shù)。慢哈希技術(shù)的思想就是通過重新設(shè)計哈希函數(shù),把哈希函數(shù)變得很慢,讓字典攻擊和暴力攻擊者耗費大量的機器時間,將破解的代價變得不可接受;同時這種緩慢對單個用戶登錄又不會造成大的影響。
圖2 慢哈希技術(shù)
顯然,慢哈希算法也有著明顯的缺點,它在消耗對手計算資源的同時,也消耗自己的大量計算資源。如果遇到惡意用戶,發(fā)起大量的登錄請求,服務(wù)器端會造成資源被耗盡,不能提供正常服務(wù)。所以,上圖中的方案中,將慢哈希的計算放在了web前端。
慢哈希函數(shù)的設(shè)計有很多方法,最簡單的方法就是對原哈希函數(shù)做循環(huán)計算,但我們一般提倡使用標(biāo)準(zhǔn)的慢哈希函數(shù),主要有PBKDF2或者Bcrypt。
基于上述詳細(xì)分析,我們可以得出結(jié)論,如果在網(wǎng)絡(luò)應(yīng)用編程中使用口令認(rèn)證方式,至少應(yīng)滿足如下條件:
(1)口令不可以明文在網(wǎng)絡(luò)上傳輸,應(yīng)該使用哈希函數(shù)。
(2)即使被拖庫,也無法還原用戶密碼。
(3)應(yīng)該有能力應(yīng)對暴力破解、字典攻擊。
(4)應(yīng)該有能力應(yīng)對查表攻擊與彩虹表攻擊。
(5)應(yīng)該不占用過大的計算資源。
(6)應(yīng)該易于編程實現(xiàn)。
因此,認(rèn)證方案中應(yīng)該包括的技術(shù)有哈希技術(shù)、加鹽技術(shù),若欲達(dá)到一定的安全強度,則須考慮在web前端采用慢哈希技術(shù),慢哈希的計算速度應(yīng)該由服務(wù)器端來確定。
假定:注冊階段已完成,此時,客戶端已擁有賬號與密碼;服務(wù)器端已建立起用戶密碼庫,存儲模式為(userid, password_hash),鹽值單獨存放,防止拖庫,存儲模式為(userid,salt_hash,cost),其中cost字段為慢哈希代價,用來指定客戶端的慢哈希速度,cost值越大,web端運行越慢。
則登錄階段的協(xié)議描述為:
(1)客戶端以userid發(fā)起登錄請求。
(2)服務(wù)器端響應(yīng),生成一隨機鹽值salt=random(),h(salt)存儲,選定cost值,將cost、salt發(fā)送。
(3)客戶端計算r= PBKDF2( PRE, Password, Salt, cost, LEN),發(fā)送。PRE為隨機函數(shù),LEN為輸出長度。
(4)服務(wù)端收到r,與自己計算的PBKDF2 (password, salt, cost)比較,若相等,則存儲于password_hash字段,通過認(rèn)證。若不相等則丟棄。
此方案設(shè)計相當(dāng)簡潔,只用到2 次交互,計算量取決于慢哈希速度,但計算量可控,能夠滿足上面提到的6個條件。
在方案中采用了加鹽的hash技術(shù),并且,鹽值由服務(wù)端隨機生成,且每次登錄都不會相同,所以能夠抵抗查表法、彩虹表法的攻擊。
由于使用了PBKDF2慢哈希函數(shù),因此對暴力破解、字典攻擊有較好的效果。
顯然,慢哈希會增大服務(wù)器的計算量,在這里我們采取了一種折中方案,也就是說,雙方的運算量由服務(wù)器決定,服務(wù)器可根據(jù)自己的網(wǎng)絡(luò)負(fù)載情況,選擇cost值,并且將此值發(fā)送web客戶端。cost值越大,運算量越大,速度越慢。
幾種特殊情況:
(1)假定攻擊者網(wǎng)絡(luò)監(jiān)聽,竊取了userid,然后實行假冒攻擊,但他無法對服務(wù)器發(fā)送來的cost、salt計算出r,即使他知道函數(shù)PBKDF2,也無法知道password。
(2)因監(jiān)聽導(dǎo)致單個鹽值泄露,因為鹽值是隨機、一次性的,攻擊者構(gòu)造彩虹表是困難的。
(3)最壞的情況,服務(wù)器被拖庫,但攻擊者拿到的不是密碼明文、鹽值明文,而是哈希變換過的值,且密碼是經(jīng)過加鹽存儲的,破解難度很大。
口令認(rèn)證是目前普遍使用的方式,但口令方式并不是一種簡單的方式,方案越簡單,意味著越不安全;口令認(rèn)證也不是一種廉價的方式,如果綜合考慮登錄、密碼更新協(xié)議,口令認(rèn)證其實較復(fù)雜。因此設(shè)計方案時,須權(quán)衡安全級別與資源占用代價,盡可能堵住已知漏洞,正確選擇方案中的參數(shù),比如鹽值不能太短,哈希函數(shù)的位數(shù)等;靈活使用目前的密碼設(shè)計的關(guān)鍵技術(shù),哈希技術(shù)、加鹽技術(shù)、慢哈希技術(shù)等,包括S/KEY一次一密等。本方案的安全性、資源占用均衡,易于編程實現(xiàn),能夠滿足一般的網(wǎng)絡(luò)應(yīng)用系統(tǒng)的要求。
[1]Oechslin P.Making a Faster Cryptanalytic Time-Memory Trade-Off. In: Boneh D. Advances in Cryptology - CRYPTO 2003. CRYPTO 2003. Lecture Notes in Computer Science, vol 2729. Springer, Berlin, Heidelberg.
[2]http://www.freerainbowtables.com/en/tables/.
[3]祁鑫,魏美榮,蔣文保.口令加密算法安全性分析與對比[J].網(wǎng)絡(luò)空間安全,2016.
[4]韓霖,張燁青,金健宇,方丹丹.高校信息平臺用戶口令安全策略研究[J].信息安全研究,2016.
[5] https://crackstation.net/.
[6]鄧飛,朱瑩.基于口令的客戶端/服務(wù)器認(rèn)證協(xié)議[J].計算機工程與應(yīng)用,2015.
[7]汪定等.一個強口令認(rèn)證方案的攻擊與改進[J].計算機科學(xué),2012.
[8]王平,汪定,黃欣沂.口令安全研究進展[J].計算機研究與發(fā)展,2016.
[9]于江,蘇錦海,張永福.基于Hash函數(shù)的強口令認(rèn)證方案設(shè)計與分析[J].計算機應(yīng)用,2009.
山東省重點研發(fā)計劃項目(2016GGX101027)。