祁鑫+++魏美榮+++蔣文保
【 摘 要 】 隨著信息技術(shù)的快速發(fā)展與滲透,數(shù)據(jù)庫應(yīng)用越來越廣泛。但伴隨著近期CSDN、如家、漢庭甚至小米論壇所涉及的數(shù)據(jù)泄露事件,也表明了數(shù)據(jù)庫存儲(chǔ)的安全性問題日顯突出。論文首先介紹了數(shù)據(jù)庫存儲(chǔ)安全的現(xiàn)狀,區(qū)分了MD5的碰撞性在算法與在應(yīng)用上的根本區(qū)別。然后,指出了傳統(tǒng)MD5哈希算法與加鹽哈希算法在某些應(yīng)用場(chǎng)景下的誤區(qū),總結(jié)了安全的加鹽哈希算法應(yīng)用。最后,通過PBKDF2迭代算法對(duì)加鹽哈希算法應(yīng)用流程進(jìn)行優(yōu)化,利用Python編程還原哈希過程,并通過測(cè)試驗(yàn)證了該種慢速哈希算法的應(yīng)用,可以使利用高性能硬件進(jìn)行字典或者暴力破解的速度慢到?jīng)]有實(shí)用價(jià)值。
【 關(guān)鍵詞 】 數(shù)據(jù)庫; 安全; 哈希算法; SHA256;PBKDF2
Security Analysis and Comparison of Password Encryption Algorithms
Qi Xin Wei Mei-rong Jiang Wen-bao
(Beijing Information Science and Technology University Beijing 100192)
【 Abstract 】 With the rapid development of information technology, Application database are more widely. But recent such as CSDN, even millet forum, home Hanting involved data leakage problems, it showed a significant outstanding safety issues with date database storage. This paper describes the status of the database storage security and distinction between the MD5 collision of fundamental differences in the algorithms and the application. Then, noting the traditional salted MD5 hash algorithm and hash algorithm errors in certain scenarios, summarized the safety salted hash algorithm used. Finally, improving the salt hash function by using PBKDF2 to iterative algorithm and using python programming to restore thehash process and validation this kind of slow hash algorithm applications can make the hash function very slow, so that even with a fast custom hardware, dictionary and brute-force attacks are too slow to be worthwhile.
【 Keywords 】 database; security; hah algorithm; sha256; pbkdf2
1 引言
隨著計(jì)算機(jī)和網(wǎng)絡(luò)的迅速發(fā)展,數(shù)據(jù)庫應(yīng)用越來越廣泛。信息加密及用戶認(rèn)證機(jī)制對(duì)于用戶數(shù)據(jù)的保護(hù)更顯得至關(guān)重要。國外的學(xué)者Piyush Gupta(2014)從密鑰、程序塊、循環(huán)等方面對(duì)比了SHA與MD5算法[1]。國內(nèi)研究人員對(duì)傳統(tǒng)用戶口令認(rèn)證加密算法進(jìn)行了研究。其中,劉洪民(2014.5)在“MD5算法在用戶口令認(rèn)證中的應(yīng)用”中提出了通過加密過程變換、局部修改方法以保證MD5算法在應(yīng)用中的安全性[2]。趙光亮(2015年)在“基于MD5 算法安全性研究發(fā)展及分析”中提出了通過加鹽、多次加密等方法提高傳統(tǒng)MD5算法安全性[3]。
本文通過對(duì)多種口令加密算法的安全性進(jìn)行分析和對(duì)比后,發(fā)現(xiàn)傳統(tǒng)MD5、SHA等哈希算法甚至改進(jìn)的加鹽哈希算法在某種程度上并不能滿足口令加密在應(yīng)用上的安全性需求。同時(shí)分析得出了慢速哈希算法在應(yīng)用上可以較好的防止暴力破解攻擊并利用python編程通過PBKDF2算法進(jìn)行迭代改進(jìn)了加鹽哈希函數(shù),最后通過測(cè)試驗(yàn)證了該種哈希機(jī)制在一定程度上可以解決目前傳統(tǒng)哈希算法及部分加鹽哈希算法所存在的問題。
2 安全加鹽哈希算法分析
2.1 傳統(tǒng)加鹽哈希算法的誤區(qū)
在傳統(tǒng)的數(shù)據(jù)庫密碼存儲(chǔ)過程中,很多服務(wù)商也會(huì)對(duì)密碼加鹽后進(jìn)行哈希再存儲(chǔ),但有時(shí)即使這樣還是出現(xiàn)了輕易被黑客的破解的情況,原因是對(duì)鹽的使用存在的幾個(gè)誤區(qū)。
誤區(qū)1:?jiǎn)我畸}的使用
在每一個(gè)密碼hash里使用相同的鹽會(huì)使這種防御方法失效,因?yàn)橄嗤拿艽ahash兩次得到的結(jié)果還是相同的。攻擊者就可以進(jìn)行字典和暴力攻擊,而他們只需要在對(duì)字典中每一個(gè)密碼進(jìn)行hash之前加上這個(gè)固定的鹽就可以實(shí)現(xiàn)快速破解哈希摘要了。
誤區(qū)2:使用長(zhǎng)度較短的鹽
當(dāng)鹽的位數(shù)較短的話,攻擊者可以預(yù)先制作針對(duì)所有可能的鹽的查詢表。比如,3位ASCII字符的鹽,一共只有95^3=857,375種可能性。看起來數(shù)量很多。假如每一個(gè)鹽制作一個(gè)1MB的包含常見密碼的查詢表,857,375個(gè)鹽才是837GB,而現(xiàn)在一個(gè)1TB的硬盤成本只有幾百塊而已。[4]黑客可以將彩虹表存儲(chǔ)在大存容量盤中對(duì)密碼進(jìn)行暴力破解。
2.2 基于偽隨機(jī)數(shù)生成器的加鹽哈希算法
在相對(duì)安全的加鹽算法中,每次用戶在進(jìn)行賬號(hào)注冊(cè)、密碼更改等行為時(shí)都生成新的隨機(jī)鹽添加到用戶的密碼值中,再對(duì)其進(jìn)行哈希。通過對(duì)用戶注冊(cè)密碼加鹽哈希并對(duì)其登錄進(jìn)行驗(yàn)證的流程如圖1所示。
從圖1中我們可以看到,流程的關(guān)鍵點(diǎn)在于隨機(jī)鹽的生成,若黑客可以猜測(cè)出進(jìn)行哈希的鹽,那么就可以通過彩虹表或反向查表等方式快速對(duì)哈希結(jié)果進(jìn)行碰撞嘗試,下面我們就來分析一下如何生成一個(gè)可靠安全的隨機(jī)鹽。
這里鹽的生成,我們需要使用密碼學(xué)上可靠安全的偽隨機(jī)數(shù)生成器(Cryptographically Secure Pseudo-Random Number Generator,CSPRNG)來生成。本文利用Python編程語言分別編寫了單純sha1哈希算法與通過os.urandom模塊進(jìn)行加鹽sha1哈希算法的兩個(gè)應(yīng)用,并對(duì)存儲(chǔ)密碼的同一文本進(jìn)行哈希,得到結(jié)果如圖2所示??梢詮膯渭冞M(jìn)行sha1哈希的密文輸出中看出,對(duì)同一字符串進(jìn)行哈希得到的結(jié)果相同,那么黑客就可以通過排列查到一個(gè)用戶數(shù)據(jù)庫中重復(fù)率最高的密文,而這個(gè)密文對(duì)應(yīng)的密碼就很有可以是用戶設(shè)置的弱密碼,從而通過查詢彩虹表或反向查詢較容易地得出這個(gè)密碼的原文。
從圖2針對(duì)同一文本的加鹽哈希值的輸出結(jié)果中,可以看到加入隨機(jī)鹽后(這里使用的CSPRNG是Python中的os.urandom模塊)對(duì)同一明文的進(jìn)行哈希的結(jié)果卻完全不同,這樣黑客既無法找出密文的重復(fù)值也無法猜測(cè)出鹽的值,從而大幅增加了攻擊成本。
3 基于PBKDF2的慢速哈希算法分析
如2.2中所述,算法中加鹽的步驟既可以應(yīng)用在原始密碼后,即
sha1($password.$salt)
也可以先將原始密碼進(jìn)行哈希對(duì)其結(jié)果加鹽再進(jìn)行第二次哈希,即
sha1(sha1($password).$salt
以上二者究其根本并無太大差異,并且通過安全的隨機(jī)鹽設(shè)置可以達(dá)到抵御大部分黑客使用彩虹表猜測(cè)及通過個(gè)人計(jì)算機(jī)進(jìn)行暴力破解的威脅。但近一步假設(shè),攻擊者利用成本巨大的超級(jí)計(jì)算機(jī)群進(jìn)行暴力猜解的話,那該算法被破解也將并非難事。因此,可以再如上算法的基礎(chǔ)上近一步改進(jìn),減緩哈希的計(jì)算速度,再次提高破解成本,如此可以利用BCrypt或PBKDF2算法。該類算法的特點(diǎn)均為采用一種稱為key擴(kuò)展(key stretching)的技術(shù)。
這是一種基于迭代復(fù)雜度保證密碼安全的加密方法。在進(jìn)行加密之前,本文依舊用了os.urandom函數(shù)作為隨機(jī)串生成器。
下面就是算法的執(zhí)行過程,對(duì)于一個(gè)明文,算法將其與隨機(jī)串連接后送入基礎(chǔ)加密算法,得到一個(gè)加密串,再將加密結(jié)果與隨機(jī)串連接,送入基礎(chǔ)加密算法……如此迭代執(zhí)行至達(dá)到預(yù)設(shè)的迭代次數(shù)為止。其中,迭代次數(shù)C決定了偽隨機(jī)函數(shù)生成一個(gè)主密鑰所需的迭代次數(shù)。這個(gè)值決定了輸入密碼的密鑰生成時(shí)間,在用戶可以接受這個(gè)時(shí)間長(zhǎng)度下,迭代次數(shù)設(shè)置的越大越安全。對(duì)于普通用戶而言,迭代次數(shù)建議至少為1000次。而對(duì)于一些極其重要的密碼或者對(duì)于一些計(jì)算能力強(qiáng)大的系統(tǒng),迭代次數(shù)設(shè)置為10,000,000次比較合適。其中,該算法中輸入、參數(shù)、輸出的對(duì)應(yīng)值如表1-3所示。
算法如下所示。
If (kLen > (232-1) * hLen)
Return Error;
len = [kLen / hLen];
r = kLen - (len - 1) * hLen ;
For i = 1 to len
Ti = 0;
U0 = S || Int (i);
For j=1 to C
Uj = HMAC(P, Uj-1 )
Ti = Ti ?茌Uj
Return MK = T1 || T2 ||...|| Tlen<0…r-1>
其中,最后一次的加密結(jié)果就是算法的輸出了。在驗(yàn)證的時(shí)候,將明文和存儲(chǔ)的隨機(jī)串重復(fù)上述加密過程,比對(duì)加密結(jié)果。其加鹽哈希算法流程圖如圖3所示。
本文在安全加鹽哈希算法的基礎(chǔ)上改進(jìn)了哈希函數(shù),算法的設(shè)計(jì)思路是通過一種大量消耗CPU資源的hash函數(shù)讓哈希過程變得非常緩慢,使得利用計(jì)算機(jī)群進(jìn)行字典或者暴力猜解的速度也慢到?jīng)]有實(shí)用價(jià)值。其中的安全變量或者迭代次數(shù)作為參數(shù),而這個(gè)參數(shù)決定了哈希過程的速度是快是慢。通過參考美國國家標(biāo)準(zhǔn),本文利用Python編寫的基于PBKDF2的哈希算法。最后的哈希結(jié)果由base64加密輸出,如圖4所示。
可以看出使用PBKDF2哈希算法并將迭代次數(shù)設(shè)置為10000次后,計(jì)算13條密碼的時(shí)間已經(jīng)增加至將近2s,其相較普通的SHA1加鹽哈希算法,計(jì)算時(shí)間得到大幅增加,這就意味著黑客在進(jìn)行暴力破解時(shí)所花費(fèi)的時(shí)間成本將會(huì)大到難以測(cè)量。為了直觀的對(duì)比兩種哈希算法的哈希時(shí)間,本文利用兩種算法分別哈希一定數(shù)量的密碼值。如表4所示,分別測(cè)試500、1000、5000、10000、20000個(gè)密碼數(shù)據(jù)并記錄所需的哈希時(shí)間,單位秒。
通過定量分析,將數(shù)據(jù)量化成可視化圖表,這里僅舉SHA512、PBKDF2(迭代1000次)、PBKDF2(迭代10000次)三種算法的測(cè)試結(jié)果為例,如圖5所示。可以直觀看到PBKDF2算法通過迭代大大增加了哈希時(shí)間,將迭代次數(shù)設(shè)置為10000次時(shí),哈希20000個(gè)密碼值時(shí)所用時(shí)間為2234秒,相比之下普通哈希算法所需時(shí)間還不到1秒。
根據(jù)上述結(jié)果大致推算,利用PBKDF2哈希算法,假設(shè)黑客在破解1000萬個(gè)密碼所花費(fèi)的時(shí)間大約增加到了至少約25.3天,這可以以令黑客望而卻步,也在極大程度上增加了黑客利用暴力破解或字典攻擊所花費(fèi)的時(shí)間成本。與此同時(shí),每個(gè)密碼仍使用不足1秒的時(shí)間進(jìn)行加密,所以不會(huì)對(duì)用戶體驗(yàn)產(chǎn)生什么影響。但由于用戶密碼存儲(chǔ)的數(shù)據(jù)哈希主要用于Web應(yīng)用中使用Key擴(kuò)展hash函數(shù),考慮到有大量的計(jì)算資源用來處理用戶認(rèn)證請(qǐng)求。在使用Key擴(kuò)展的哈希函數(shù),迭代次數(shù)的設(shè)置還是應(yīng)該結(jié)合自己服務(wù)器的計(jì)算能力和預(yù)計(jì)每秒需要處理的認(rèn)證請(qǐng)求次數(shù)進(jìn)行參考。
4 結(jié)束語
本文針對(duì)數(shù)據(jù)庫存儲(chǔ)安全性現(xiàn)狀與哈希算法進(jìn)行了探討和研究,明確了MD5的碰撞性在算法上與在應(yīng)用上的實(shí)質(zhì)性區(qū)別,并指出了傳統(tǒng)哈希算法與加鹽哈希算法在某些應(yīng)用場(chǎng)景下的誤區(qū),總結(jié)了安全的加鹽哈希算法應(yīng)用,并利用Python編程還原哈希過程且對(duì)其進(jìn)行驗(yàn)證。近一步,在上述安全加鹽哈希算法的基礎(chǔ)上改進(jìn)了哈希函數(shù),利用PBKDF2算法進(jìn)行迭代計(jì)算,使得哈希過程變得非常緩慢,同樣利用Python編程還原哈希過程且進(jìn)行對(duì)其驗(yàn)證,并說明了該機(jī)制的實(shí)施可以使得利用計(jì)算機(jī)群進(jìn)行字典或者暴力猜解的速度也慢到?jīng)]有實(shí)用價(jià)值。
參考文獻(xiàn)
[1] Piyush Gupta et al, A Comparative Analysis of SHA and MD5 Algorithm, IJCSIT(4492-4495)Vol.5 (3), 2014.
[2] 劉洪民,印幫輝.MD5算法在用戶口令認(rèn)證中的應(yīng)用[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2014(05).
[3] 趙光亮,韋雅文.基于MD5算法安全性研究發(fā)展及分析[J].福建電腦.2015(02).
[4] NIST Special Publication 800-132, Recommendation for Password-Based Key Derivation.
基金項(xiàng)目:
國家自然科學(xué)基金資助項(xiàng)目[61540020]。
作者簡(jiǎn)介:
祁鑫 (1991-),男,北京人,北京信息科技大學(xué),在讀研究生;主要研究方向和關(guān)注領(lǐng)域:信息安全。
魏美榮(1992-),女,北京人,北京信息科技大學(xué),在讀研究生;主要研究方向和關(guān)注領(lǐng)域:信息安全。
蔣文保(1969-),男,湖南人,畢業(yè)于清華大學(xué),博士后,北京信息科技大學(xué)信息管理學(xué)院副院長(zhǎng),信息系統(tǒng)研究所副所長(zhǎng),教授,碩士生導(dǎo)師;主要研究方向和關(guān)注領(lǐng)域:網(wǎng)絡(luò)與信息安全領(lǐng)域的科學(xué)研究、產(chǎn)品開發(fā)、教學(xué)和管理。