哈希密碼加密和破解淺析

所謂哈希密碼,指的是對(duì)口令進(jìn)行一次性的加密處理而形成的雜亂字符串。這個(gè)加密的過(guò)程被認(rèn)為是不可逆的,也就是說(shuō),從哈希串中是不可能還原出原口令的。雖然它不是唯一一個(gè)能夠保證你的聯(lián)網(wǎng)應(yīng)用程序安全性的方法,但是它是眾多安全保護(hù)措施中的一個(gè),每一個(gè)有安全意識(shí)的開(kāi)發(fā)者都應(yīng)該考慮這個(gè)問(wèn)題。

每當(dāng)我們要討論安全問(wèn)題時(shí),大家總會(huì)有一個(gè)疑問(wèn):我們所要防御的安全威脅到底是什么?對(duì)于密碼哈希而言,答案肯定不會(huì)盡如人意:我們正在努力的是-當(dāng)你網(wǎng)站數(shù)據(jù)庫(kù)中存儲(chǔ)的所有密碼被盜竊之后,我們?nèi)绾蝸?lái)緩解這類(lèi)事件給人們帶來(lái)的影響。通常情況下,如果攻擊者成功進(jìn)入了目標(biāo)數(shù)據(jù)庫(kù)之后,數(shù)據(jù)庫(kù)中的許多數(shù)據(jù)都有可能被盜,而這也是每一個(gè)信息安全從業(yè)人員的噩夢(mèng)。

哈希密碼加密和破解淺析

我們現(xiàn)在來(lái)討論一下,如果攻擊者已經(jīng)得到了你的密碼數(shù)據(jù)庫(kù),會(huì)發(fā)生什么事情呢?攻擊者能夠利用這些數(shù)據(jù)來(lái)做些什么呢?實(shí)際上,所有相關(guān)的攻擊都與恢復(fù)出用戶(hù)密碼有關(guān),因?yàn)橹挥挟?dāng)獲取到用戶(hù)的密碼之后,攻擊者才可以進(jìn)行下一步操作。
如果你的數(shù)據(jù)庫(kù)中存儲(chǔ)的是明文形式的密碼,那么你就不用掙扎了。攻擊者已經(jīng)獲取到了所有的用戶(hù)密碼,他可以開(kāi)始為所欲為了。這簡(jiǎn)直太糟糕了。
嘗試1#:簡(jiǎn)單的密碼哈希
你可能會(huì)認(rèn)為:“嗨,只要我們使用SHA256算法(或者SHA-3,或者其他的一些安全哈希算法)來(lái)對(duì)密碼進(jìn)行哈希處理,那么一切問(wèn)題都不存在了?!比绻氵@樣想的話(huà),那么遲早都會(huì)出現(xiàn)問(wèn)題。然而真實(shí)的情況往往會(huì)更加的復(fù)雜。
比如說(shuō),我們將現(xiàn)在的情況更加具體化。當(dāng)你使用下列形式的哈希函數(shù)來(lái)對(duì)存儲(chǔ)的密碼進(jìn)行處理時(shí),會(huì)發(fā)生什么?
1P’=SHA256(P) (*)
其中,P為密碼,P’為存儲(chǔ)在數(shù)據(jù)庫(kù)中的密碼。
字典攻擊
那么,假設(shè)攻擊者已經(jīng)獲取到了所有存儲(chǔ)在數(shù)據(jù)庫(kù)中的密碼了,而數(shù)據(jù)庫(kù)中的密碼僅僅使用了SHA256來(lái)進(jìn)行哈希加密,正如我們?cè)谏厦嫠谐龅墓?*)。那么攻擊者能夠利用竊取來(lái)的密碼數(shù)據(jù)做些什么呢?
首先,他可以獲取一個(gè)記錄了大量常用密碼的字典文件,然后利用字典中的密碼來(lái)依次進(jìn)行嘗試。也就是說(shuō),攻擊者可以利用SHA256算法來(lái)對(duì)字典里的密碼進(jìn)行哈希處理,然后與數(shù)據(jù)庫(kù)中存儲(chǔ)的密碼哈希進(jìn)行對(duì)比(這也就是我們所說(shuō)的“字典攻擊”)。
請(qǐng)注意,使用簡(jiǎn)單的P’=SHA256(P)函數(shù)來(lái)進(jìn)行哈希處理,也就意味著相同的“P”值在經(jīng)過(guò)公式計(jì)算之后,將會(huì)得到相同的“P’”。也就是說(shuō),相同的密碼在經(jīng)過(guò)哈希處理之后,生成的密碼哈希也是相同的。
這樣一來(lái),攻擊者就可以利用SHA256算法預(yù)先對(duì)當(dāng)前所有常用的密碼進(jìn)行哈希處理,然后在攻擊者成功獲取到了數(shù)據(jù)庫(kù)中的數(shù)據(jù)之后,就可以利用這些預(yù)先計(jì)算好的密碼哈希來(lái)進(jìn)行對(duì)比了。相較于沒(méi)有經(jīng)過(guò)哈希處理的密碼而言,密碼哈希將會(huì)增加攻擊者破解密碼的難度。因此,對(duì)密碼進(jìn)行簡(jiǎn)單的哈希處理總是比沒(méi)有進(jìn)行哈希處理的密碼要安全得多,但是這項(xiàng)技術(shù)仍然有很大的提升空間。

哈希密碼加密和破解淺析
嘗試2#:經(jīng)過(guò)Salted的哈希
對(duì)相同的密碼進(jìn)行哈希處理之后,得到的密碼哈希是相同的。為了解決這個(gè)問(wèn)題,我們需要對(duì)密碼哈希進(jìn)行Salted處理,即“哈希加鹽法”。
這種方式的工作機(jī)制為:當(dāng)我們?cè)谟?jì)算相應(yīng)“P’”之前,針對(duì)每一個(gè)用戶(hù)的密碼,我們都會(huì)存儲(chǔ)一個(gè)相應(yīng)的“S”值(即鹽值)。當(dāng)我們需要將用戶(hù)密碼存入數(shù)據(jù)庫(kù)之前,我們需要利用下列公式來(lái)進(jìn)行計(jì)算:
1P’=SHA256(S||P)
其中,“||”為連接的意思(例如字符串/數(shù)據(jù)塊的級(jí)聯(lián))。
只要用戶(hù)的“S”值與其他用戶(hù)不同,那么即使不同用戶(hù)使用的是相同的密碼,計(jì)算出來(lái)的密碼哈希值也不會(huì)相同。所以這也就意味著,攻擊者預(yù)先計(jì)算出的密碼哈希將無(wú)法使用,字典攻擊也就失效了。實(shí)際上,我們所介紹的“哈希加鹽法”還可以抵御一些其他的“預(yù)先計(jì)算”攻擊,包括所謂的“彩虹表攻擊”在內(nèi)。
而我們需要考慮的另一個(gè)問(wèn)題就是使用什么樣的“Salt”。首先,每一個(gè)用戶(hù)所使用的“S”值必須是獨(dú)一無(wú)二的。這也就意味著,如果你所使用的隨機(jī)“Salt”值足夠長(zhǎng),你就不需要檢查鹽值的唯一性了。

對(duì)哈希函數(shù)進(jìn)行離線(xiàn)暴力破解攻擊
即便是我們?cè)趯?duì)密碼進(jìn)行哈希處理時(shí)加入了“Salt”,并且也僅用了字典密碼。攻擊者仍然有其他的方法來(lái)破解我們的密碼數(shù)據(jù)庫(kù)。
我所指的就是離線(xiàn)暴力破解攻擊,需要注意的是,這種方式與在線(xiàn)暴力破解不同。當(dāng)攻擊者利用在線(xiàn)暴力破解的方式來(lái)攻擊數(shù)據(jù)庫(kù)時(shí),攻擊者只需要不斷地嘗試登錄密碼即可。但是我們可以設(shè)置登錄失敗次數(shù)限制或者密碼嘗試的時(shí)間間隔來(lái)防止這類(lèi)攻擊。

為了對(duì)密碼數(shù)據(jù)進(jìn)行離線(xiàn)暴力破解攻擊,攻擊者首先需要獲取到存儲(chǔ)了密碼的數(shù)據(jù)庫(kù),或者至少是用戶(hù)密碼或者“salt”值的其中之一。在獲得了這些信息之后,攻擊者就可以利用公式SHA256(S||P)來(lái)對(duì)這些密碼和Salt值進(jìn)行計(jì)算了。如果計(jì)算結(jié)果能夠與“P’”值相匹配,那么攻擊也就成功了。在此次計(jì)算中所使用的“P”即為用戶(hù)的真實(shí)密碼。