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