杜 薇,張李軍,張愛麗
(1.中國電子科技集團公司第三十研究所,四川 成都 610041;2.保密通信重點實驗室,四川 成都 610041;3.河南師范大學新聯(lián)學院,河南 鄭州 450000)
網(wǎng)絡論壇是互聯(lián)網(wǎng)上的一種電子信息服務系統(tǒng),也就是BBS(電子公告牌)。它是一種交互性強、內(nèi)容豐富、及時性強且非常受歡迎的電子信息服務平臺。網(wǎng)絡論壇可為其注冊用戶提供多種服務,如信息交換、聊天和信息共享等。伴隨著網(wǎng)絡的蓬勃發(fā)展,論壇也有了迅猛發(fā)展。論壇可以分為綜合類論壇和專題類論壇。綜合類論壇信息豐富、廣泛,包含了很多方面的信息,主要由大規(guī)模的網(wǎng)站組成。專題類論壇主要聚焦在某種類型的信息或者資源上。專題類論壇對個人消費和科學研究起著重要作用,每個人都可以根據(jù)自己的興趣愛好找到對應的專題類論壇,如購物論壇、旅游論壇和編程論壇等。隨著網(wǎng)絡論壇的廣泛使用,它的安全性也受到越來越多網(wǎng)絡用戶的關心。目前,口令是注冊用戶登陸論壇的最常用途徑。因此,它最重要的安全就是用戶口令的安全,而時不時發(fā)生的口令泄露事件震驚了絕大多數(shù)論壇用戶。2011年11月,著名的計算機論壇CSDN泄露了大概600萬用戶的隱私,包括口令、郵件、生日和電話號碼等[1]。于此同時,天涯社區(qū)超過4 000萬用戶的用戶名和密碼也被公布于眾[2]。這無疑大大影響了大眾對論壇安全的態(tài)度。2014年12月25日,官方鐵路售票網(wǎng)站12306超過13萬用戶的賬號、郵件和口令被泄露,甚至那些以密文方式存儲于數(shù)據(jù)庫中的口令也被泄露[3]??梢?,口令的安全性面臨著現(xiàn)實的挑戰(zhàn)。
論壇是由論壇軟件開發(fā)的,其中Discuz!和PhpWind是2個大家廣泛熟悉的軟件。2個論壇前端均采用“PHP”網(wǎng)絡編程語言,后端數(shù)據(jù)庫采用SQL或者MYSQL的設計架構。這樣的架構有許多優(yōu)點:多國語言的支持,適配公開或者私有的論壇建設,集成強大的搜索工具等。之所以聚焦于這2類論壇,是因為目前這2類論壇占有超過90%的市場份額。當前,網(wǎng)絡論壇的安全性已經(jīng)引起了很多學者的關注。Horseluke研究了Discunz[4]的加密函數(shù),Bkd指出了PhpWind[5]的加密漏洞,Liu也分析了這個論壇所使用的cookie加密函數(shù)[6]。Zhang在2013年給出了phpBB3論壇的詳細的安全分析[7]。
不同的論壇開發(fā)軟件不同,口令的安全也不同。本文主要分析Discuz!和PhpWind論壇的口令安全,包括口令加密、口令破解的復雜性。通過安全性對比,針對加密算法的具體實現(xiàn)和口令的選擇策略,提出了一些建議,用于增強論壇用戶口令的安全性。
論壇軟件的口令加密機制主要是指用戶口令的加密存儲。它可以分為兩個方面,服務器端口令的加密存儲和本地瀏覽器端口令的加密存儲。在服務器端,后端數(shù)據(jù)庫存儲用戶名和對應的加密后的口令。而本地瀏覽器端,這些信息也會被加密并保存在cookie里,以方便用戶之后直接登錄網(wǎng)站。下面將依次分析這2個論壇的口令加密方案。
1.1.1 服務器端口令加密
用戶注冊論壇時,會按要求提供用戶名和口令。對于每一個用戶名,Discuz!論壇軟件會產(chǎn)生一個長度為6 Byte的隨機數(shù),稱為salt值,用于口令加密。用戶提交口令后,口令會被MD5算法加密2次。首先將用戶口令直接作為MD5算法的輸入,其次MD5算法的運算結果與salt值級聯(lián)后,再次作為MD5算法的輸入。加密運算表達為:
其中PASS是password對應的密文。
服務器將PASS作為最終的口令存儲于數(shù)據(jù)庫,同時將用戶名和對應的salt值存放在數(shù)據(jù)庫的“uc_member”表中。其中,“uc_member”表隸屬于一個專用系統(tǒng)管理軟件“UCenter”。當用戶登錄后,數(shù)據(jù)庫會根據(jù)用戶名檢索對應的salt值,計算MD5(MD5(logging password)||salt)得到登錄所用口令的密文結果。如果計算得到的結果與存儲在數(shù)據(jù)庫中的PASS數(shù)據(jù)匹配,用戶則可以成功登錄論壇。在注冊和登錄階段的口令處理過程如圖1所示。
圖1 口令的加密與存儲
需要注意的是,在Discuz!軟件中,本身也有一個所謂的“password”存放在“members”表中,計算方式為:
即password是對一個隨機數(shù)的MD5的雜湊值,但這個password對論壇用戶毫無用處。它的存在只是為了保持與上一個Discuz!版本的兼容性。實際上,真正驗證用戶的口令依舊在“UCenter”界面實現(xiàn)。
1.1.2 安全提問的加密
除用戶口令外,用戶注冊Discuz!論壇時,也需要對指定的安全提問做出回答。用戶忘記口令時,可以根據(jù)當時注冊時所留安全提問的答案找回口令。若用戶的答案正確,可以重置用戶口令。通過研究Discuz!論壇的源代碼可以發(fā)現(xiàn),這些安全提問的答案也是采用MD5算法加密。
加密運算流程如下:
其中ID是安全問題的ID,substr表示截取MD5雜湊值的第16~24位。
下面給出一個安全提問的答案加密過程的實例。
假設注冊時論壇給出3個安全提問,用戶選擇對第3個安全提問進行回答,且答案為“1v1.name”。
假設安全提問如下:
根據(jù)加密函數(shù),加密過程如下:首先計算第3個安全提問對應的ID=7的MD5的雜湊值,結果是8f14e45fceea167a5a36dedd4bea2543;其次,將對應的安全提問的答案與雜湊值拼接,為1v1.name8f14e 45fceea167a5a36dedd4bea2543;再次,計算其MD5的雜湊值,為f5d8e00a4ebc9ead 4611c04706ae05fd;最后,截取其雜湊結果的第16~24位,結果為“4611c047”,即Answer的值。 1.1.3 本地cookie口令加密 通過瀏覽器首次登錄過論壇后,Discuz!論壇會借助加密函數(shù)“authcode”加密用戶的個人信息(如用戶名、口令、單位等),并將其對應的密文存放于本地瀏覽器的cookie中。這大大方便了用戶的后續(xù)登錄,因為瀏覽器會直接讀取密文,解密用戶名、口令,驗證其正確性。如果解密后的信息正確,用戶不需要再次輸入用戶名和口令就可以直接登錄?,F(xiàn)在給出本地cookie口令加密的原理。 本地cookie加密的過程分成3個階段:密鑰產(chǎn)生、類似RC4算法的加密和解密以及時效性和數(shù)據(jù)完整性校驗,如圖2所示。 圖2 本地cookie加密的過程 密鑰產(chǎn)生階段(詳見圖3)描述了加密(或解密)密鑰和完整性密鑰的產(chǎn)生。加密密鑰與RC4算法一起用于加密(或解密)用戶的個人信息,而完整性密鑰用于解密過程中,對數(shù)據(jù)進行完整性校驗。首先,由全局變量“Discuz_auth_key”產(chǎn)生初始密鑰,然后初始密鑰再分解成3個子密鑰,即Key_a、Key_b和Key_c。從圖3可知,由這些子密鑰可以得到加密密鑰和完整性密鑰。 圖3 密鑰產(chǎn)生的過程 密鑰產(chǎn)生后,瀏覽器使用RC4算法加密(或解密)用戶登錄信息。加密時,密文存儲于cookie中;解密時,對解密后的信息進行時效性檢查和數(shù)據(jù)完整性驗證。 這個驗證過程可以被描述為如下幾個情況: (1)substr(result,0,10)==0; (2)(substr(result,0,10)-time)0; (3)substr(result,10,16)==substr(md5(substr(resu lt,26)||Key_b),0,16); 只要滿足前兩個情況中的一個就足夠了。第一條表示數(shù)據(jù)的時效性是永久的,第二個條件表示cookie解密必須在cookie產(chǎn)生后,第三條則是通過檢驗“Key_b”的完整性來防止cookie被篡改。 1.2.1 服務器端口令加密 PhpWind論壇的每一個口令都僅采用一個簡單的MD5算法加密:PASS=MD5(password)。所有的口令經(jīng)過MD5運算后會被存儲到數(shù)據(jù)庫中。注意,這里沒有引入隨機數(shù)技術(即沒有像Discuz!論壇里使用的salt值),而且MD5加密也僅僅執(zhí)行了一次而已。 1.2.2 本地cookie口令加密 PhpWind論壇的cookie口令加密方式與Discuz!論壇類似,包含兩個階段。首先,它采用一個名為“PwdCode”的函數(shù)計算用戶口令的MD5值。其次,通過一個名為“StrCode”的函數(shù)將此雜湊值編碼為base64放入cookie中。第一階段的明文包含瀏覽器的全局信息、用戶口令以及一個稱為安全認證參數(shù)的雜湊字符串。 整個加密過程可以由如下的偽代碼描述: PwdCode(password){ return MD5(Global[sever]||password||Global[hash]); } StrCode (string){ Key=substr(md5(Global[server]||Global[ha sh]),8,18); Keylen=strlen(key); Strlen=strlen(string); for(i=0;i K=i% keylen; Code=string[i]^key[k]; } return base64(code); } 其中Global[server]和Global[hash]是用戶瀏覽器的2個全局參數(shù)。 本節(jié)將從2個方面對口令加密的安全性進行分析:加密算法的強度和口令破解的復雜度。 這2個論壇采用的核心算法都是MD5加密算法,但是在具體實現(xiàn)上又有所不同。眾所周知,理論上廣泛應用的MD5雜湊算法具有抗碰撞和不可逆性。即已知一個雜湊值,想要反向計算出原本的輸入消息(也就是用戶的口令)是困難的。另外,幾乎無法找到2個不同的消息經(jīng)過同一個雜湊運算后能得到相等的雜湊值。然而,實際中如果用教科書版本的方式來實現(xiàn)MD5算法,想要從MD5雜湊值反向計算出口令也是可能的。 下面將仔細分析Discuz!和PhpWind論壇中2種MD5加密方案的具體實現(xiàn)。 例1:直接使用MD5算法來加密口令。 直接使用MD5算法來加密口令,即PASS=MD5(password)。這個方案就是PhpWind論壇使用的方案。雖然理論上MD5算法是一個安全的雜湊算法,但實際中未必如此。如果數(shù)據(jù)庫泄露,用戶的口令也會隨之暴露,因為已知某個口令的MD5雜湊值可對其進行字典攻擊[8-9],即不需要花費太多的努力就能在可接受的時間內(nèi)確定口令的明文。此外,現(xiàn)在已經(jīng)存在了大量可以通過互聯(lián)網(wǎng)免費下載的壓縮字典,名為“彩虹表”[10]。如果一個黑客設法獲得了存儲于論壇數(shù)據(jù)庫存儲的口令雜湊值,再從互聯(lián)網(wǎng)下載彩虹表,通過查詢彩虹表已有的口令和口令的雜湊值就可以破解MD5雜湊值,從而恢復出對應的口令明文[11]。目前,基于GPU的高性能計算的發(fā)展也大大提升了破解口令的效率,幾乎可以瞬間破解一個長度小于8 Byte僅包含十進制數(shù)的口令[12]。 如今,可以利用GPU并行計算的優(yōu)勢來提高口令恢復的速度。在NVIDIA GPU上的實際測試結果為,每秒鐘破解24億個明文。表1為按照這個速度估算破解一個普通長度且同時包含小寫字母和數(shù)字的口令的時間。 表1 破解速率的評估 通過表1可以看出,破解一個長度為8 Byte的包含數(shù)字和小寫字母的口令,只需要不到20 min,即20 min內(nèi)可以計算出口令明文的所有排列組合,從而破解口令。 例2:使用salt值的MD5算法 Discuz!論壇采用MD5(MD5(logging password)||salt)方式加密用戶口令。這種MD5加密方式大大提高了安全度。目前,破解MD5雜湊值采用的最廣泛方法是彩虹表攻擊。它的主要思路是預先計算通用的口令的雜湊值。進行破解時,只需要將所獲取的論壇數(shù)據(jù)庫中的雜湊值與彩虹表中的雜湊值進行比較。如果匹配,則對應的口令被恢復。根據(jù)雜湊函數(shù)的特性,碰撞幾乎是不可能的。也就是說,對2個不同的口令進行同一個雜湊函數(shù)運算,幾乎不可能得到2個相同的雜湊值。因此,有salt的MD5算法可以阻礙上述的字典攻擊。要破解不含salt的MD5算法,彩虹表需要260 GB的容量。引入了salt后,salt取值的可能性有900 000種(salt=random(100000,999999)),因此彩虹表的容量會迅速增長到900 000×260 GB=234 PB(1 PB=106 GB),而這種級別容量遠高于當前的存儲容量。即便滿足了容量,搜索效率也非常低下,無法滿足破解的要求。 當然,現(xiàn)實中也不可能建立一個涵蓋所有口令雜湊值的彩虹表。黑客只有在容量與口令破解的成功率之間權衡。黑客往往從社會科學中選擇通用的口令來構造彩虹表。現(xiàn)在也有一些網(wǎng)站提供含有salt值的彩虹表,但破解的效率不盡如人意。例如,在一個真實的測試中,一個普遍的口令“admin888”并沒有被成功恢復。畢竟,這種攻擊方法并不能保證100%的成功率。需要注意的是,論壇中安全提問的加密過程,并沒有使用有salt的MD5加密算法。因此,破解安全提問比破解例1更為簡單。雖然例1直接使用MD5運算得到了雜湊值,但安全提問一般都有一個具體的方向,答案的范圍也非常有限。因此,答案對應的雜湊值的可能性也不會很多,大大提高了破解的速度。 通過以上口令加密的分析,可以得出一個結論:Discuz!論壇的口令安全優(yōu)于PhpWind論壇。但是,盡管Discuz!論壇引入salt值改善了口令安全,但是由于其salt的取值范圍有限,安全性也不能得到保證。 將從兩個方面提出兩點關于提高口令安全性的建議:改善加密算法的實現(xiàn)方式和優(yōu)化口令的選擇策略。 如前面指出的,salt值大大增加了從雜湊值恢復口令的復雜度。目前,Discuz!論壇的salt值長度為6 Byte,且僅包含十進制的數(shù)字。因此,將來可以將salt值的取值范圍擴大為支持任意可打印的字符。這樣將salt取值由900 000增加到了956=7.35×1 011,以讓廣泛流行的彩虹表完全失效。 通過真實的口令破解經(jīng)驗,可以提出至少2條策略來優(yōu)化口令選擇。首先,應該將口令設置為強口令。強口令是指長度不小于10 Byte,避免使用普通的數(shù)字、英文字母以及這樣的組合,如“12345678”“666666”和“birthday”等。其次,對于不同的賬戶應該設置不同的密碼,有效避免某個論壇用戶名和密碼被泄露后,其他論壇的賬戶也被泄露。 主要分析了2個論壇數(shù)據(jù)庫中口令的加密方法,發(fā)現(xiàn)瀏覽器本地cookie加密的核心加密算法類似RC4算法,而RC4算法存在安全漏洞,如RC4的WEP(一個在無線網(wǎng)絡中的加密協(xié)議)已經(jīng)被攻破[13]。今后的研究中會進一步分析這2個算法的異同,并研究破解RC4的方法是否也會破解這個算法。 發(fā)現(xiàn)PhpWind論壇使用的cookie加密函數(shù)僅僅是一個異或函數(shù),而這是一個安全性非常弱的加密方法。因為異或很容易遭受密鑰重用攻擊,即如果E(A)=A xor K,aE(B)=B xor K,那么E(A) xor E(B)=A xor B。因為(A xor K) xor (B xor K)=A xor B xor K xor K=A xor B,因此K為重復使用的密鑰。因此,很可能解密cookie的密文時,甚至不需要知道加密密鑰。這是未來研究的領域。 本文研究了兩個常用網(wǎng)絡論壇的口令安全性,仔細分析了服務器端口令加密的方案,包括其使用的密碼算法本身的安全強度和具體實現(xiàn)的方法。研究指出,PhpWind論壇的口令并不安全,其口令可以通過MD5雜湊值被瞬間破解;Discuz!論壇的口令安全優(yōu)于PhpWind論壇??紤]到可實現(xiàn)的攻擊,提出了增強口令安全和優(yōu)化口令選擇策略的意見。最后,指出2個論壇所使用的cookie加密的不足,可能導致其遭受到安全攻擊。 參考文獻: [1] 國內(nèi)最大程序員網(wǎng)站600余萬用戶信息遭泄露[EB/OL].(2011-12-22)[2018-01-09].https://news.qq.com/a/20111222/000057.htm.6 million CSDN User's Privacy are Leaked[EB/OL].(2011-12-22)[2018-01-09].https://news.qq.com/a/20111222/000057.htm. [2] 天涯承認部分用戶密碼泄露 據(jù)稱涉及4000萬人[EB/OL].(2011-12-26)[2018-01-09].https://news.qq.com/a/20111226/000061.htm.40 Million User's Passwords of TianYa Commnity are Leaked[EB/OL].(2011-12-26)[2018-01-09].https://news.qq.com/a/20111226/000061.htm. [3] 超十三萬條12306用戶數(shù)據(jù)泄露[EB/OL].(2014-12-26)[2018-01-09].http://news.sina.com.cn/o/2014-12-26/035931328946.shtml.Over 130,000 user data leaks in 12306 [EB/OL].(2014-12-26)[2018-01-09].http://news.sina.com.cn/o/2014-12-26/035931328946.shtml. [4] Horseluke.The Analysis of RC4 Encription Algorithm in Discuz Forum[EB/OL].(2011-11-08)[2018-01-09].http://bbs.phpchina.com/forum.php?mod=redirect&goto=findpost&ptid=113075&pid=1452503. [5] Bkd.The Encryption Hole of PhpWind Forum[EB/OL].(2011-11-01)[2018-01-09].http://atim.cn/index.php. [6] LIU Qing-yan.The Password and Coookie Encryption in PhpWind Forum[EB/OL].(2010-10-01)[2018-01-09].http://qing.weibo.com/discovery.html. [7] ZHANG Li-jun,JIA Fan.The Security Analysis of PhpBB Forum[C].Proceddings of 2013 Fifth International Conference on Multimedia Information Networking and Security,2013:50-53. [8] Passware Company Software.Passware Kit Enterprise and Passware Kit Forensic[Z].http://www.lostpassword.com/index.htm. [9] Elcomsoft Company Software.Disk Decryptor Forensic[Z].http://www.elcomsoft.com. [10] Oechslin P.Making a Faster Cryptanalytic Time-memory Trade-off[C].CRYPTO 2003,2003:617-630. [11] Cmd5 Organize.MD5 Plaintext Recovery Online[EB/OL].(2013-01-01)[2018-01-09].http://www.cmd5.com. [12] Tzeng S,Wei L Y.Parallel White Noise Generation on a GPU via Cryptographic Hash[C].Proceedings of the 2008 Symposium on Interactive 3D Graphics and Games,2008:79-88. [13] Klein A.Attacks on the RC4 Stream Cipher[J].Designs,Codes,and Cryptography,2008,48(03):269-286.1.2 PhpWind論壇的口令加密
2 加密安全分析和對比
2.1 加密算法的強度
2.2 口令破解的復雜度
3 口令安全的增強
3.1 選擇帶salt值的MD5加密算法
3.2 優(yōu)化口令的選擇策略
4 工作展望
5 結 語