哈希密碼加密和破解淺析

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

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

哈希密碼加密和破解淺析

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

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

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

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