天天看點

雜湊演算法在密碼加密存儲中的應用

網際網路公司資料洩露事件已經不是什麼新鮮事兒了,目前已經曝光過的資料洩露事件至少上百起,其中不乏一線網際網路公司,比較出名的資料洩露事件就有2011年CSDN的600萬使用者資料洩露事件和2016年的京東12G使用者資料洩露事件,使用者資料洩露後最大的危害就是黑客可以通過竊取到的使用者名和密碼,登入使用者賬号,侵害使用者權益,導緻這種結果的直接原因就是受害公司沒有對使用者的密碼資訊進行加密處理。如果對使用者的密碼資訊進行加密存儲,即使資料被拖庫,黑客也無法還原出原始密碼。

使用者名密碼加密存儲方法有多種,其中雜湊演算法加密是一種比較常用的簡單方法。

雜湊演算法又稱摘要算法、雜湊演算法,它通過一個函數,把任意長度的資料轉換成一個固定的長度的資料串,它是一種單向密碼體制,無法從逆向還原出原始明文。

雜湊演算法有多種,比較常用的有MD5、SHA1、SHA256等。MD5用一個32位的16進制字元串表示,雖然目前MD5已經被攻破,但是依然很流行;SHA1用一個40位的16進制字元串表示,目前也被攻破,但是相比MD5,被攻破的難度更大一些,SHA256尚未被攻破,比SHA256更加安全,但是越安全的算法越複雜,計算時間越長。

利用雜湊演算法對使用者密碼加密存儲最簡單的辦法就是一次哈希加密,python算法如圖1所示:

雜湊演算法在密碼加密存儲中的應用

圖1:一次加密雜湊演算法

即把使用者密碼簡單地進行哈希計算後進行存儲,這樣得到加密後的密碼無法還原到原始密碼,相對安全,但是可以通過彩虹表查表破譯。彩虹表就是黑客預先計算一些常用密碼的md5值,得到一個反推表,如表1所示:

雜湊演算法在密碼加密存儲中的應用

表1:彩虹表示例

這樣,無需破解,隻需要對比資料庫中的MD5,黑客就能獲得部分弱密碼的使用者賬号資訊。

如此一來,如何確定那些弱密碼使用者的賬号安全呢?可以在一次哈希加密的基礎上進行“加鹽”處理,所謂“加鹽”就是指在使用者原始密碼後面加一個複雜“鹽值”,即一個複雜的固定字元串,python算法如圖2所示:

雜湊演算法在密碼加密存儲中的應用

圖2:加密哈希加鹽算法

這樣即使使用者的弱密碼,也很難通過彩虹表反推出明文密碼,前提是這個“鹽”不被洩露,因為無法保證“鹽”的絕對安全,是以這種加密方法也隻是相對安全,不是萬無一失的。

該加密方法的硬傷是“鹽值”是固定的,如果“鹽”是随機的,那麼資料的安全性就能更高一些。

PBKDF2(Password-Based Key Derivation Function)算法原理大緻相當于在哈希加密基礎上加“随機鹽”,然後重複進行運算,并最終産生密鑰。如果重複的次數足夠大,那麼破解的成本就會變得很高,而“鹽值”的添加也會增加彩虹表的攻擊難度。PBKDF2函數的定義如圖3所示:

雜湊演算法在密碼加密存儲中的應用

圖3:PBKDF2函數的定義

PBKDF2的算法流程

DK的值由一個以上的block拼接而成,block的數量是dklen/hlen的值。就是說如果PRF輸出的結果比期望得到的密鑰長度要短,則要通過拼接多個結果以滿足密鑰的長度。

DK = T1 || T2 || ... || Tdklen/hlen

而每個block則通過函數F得到:Ti = F(Password, Salt, c, i)

在函數F裡,PRF會進行c次的運算,然後把得到的結果進行異或運算,得到最終的值。

F(Password, Salt, c, i) = U1 ^ U2 ^ ... ^ Uc

第一次,PRF會使用Password作為key,Salt拼接上編碼成大位元組序的32位整型的i作為鹽值進行運算。

U1 = PRF(Password, Salt || INT_32_BE(i))

而後續的c-1次則會使用上次得到的結果作為鹽值。

U2 = PRF(Password, U1)

...

Uc = PRF(Password, Uc-1)

函數F的大緻流程如圖4所示:

雜湊演算法在密碼加密存儲中的應用

圖4:函數F流程圖

使用PBKDF2算法時,HASH算法一般選用sha1或者sha256,随機鹽的長度一般不能少于8位元組,HASH次數至少也要1000次,這樣安全性才足夠高。一次密碼驗證過程進行1000次HASH運算,對伺服器來說可能隻需要1ms,但對于破解者來說計算成本增加了1000倍,而至少8位元組随機鹽,更是把建表難度提升了N個數量級,使得大批量的破解密碼幾乎不可行,該算法也是美國國家标準與技術研究院推薦使用的算法。

繼續閱讀