天天看點

Nodejs進階:MD5入門介紹及crypto子產品的應用

md5(message-digest algorithm)是計算機安全領域廣泛使用的散列函數(又稱雜湊演算法、摘要算法),主要用來確定消息的完整和一緻性。常見的應用場景有密碼保護、下載下傳檔案校驗等。

本文先對md5的特點與應用進行簡要概述,接着重點介紹md5在密碼保護場景下的應用,最後通過例子對md5碰撞進行簡單介紹。

運算速度快:對<code>jquery.js</code>求md5值,57254個字元,耗時1.907ms

輸出長度固定:輸入長度不固定,輸出長度固定(128位)。

運算不可逆:已知運算結果的情況下,無法通過通過逆運算得到原始字元串。

高度離散:輸入的微小變化,可導緻運算結果差異巨大。

弱碰撞性:不同輸入的散列值可能相同。

檔案完整性校驗:比如從網上下載下傳一個軟體,一般網站都會将軟體的md5值附在網頁上,使用者下載下傳完軟體後,可對下載下傳到本地的軟體進行md5運算,然後跟網站上的md5值進行對比,確定下載下傳的軟體是完整的(或正确的)

密碼保護:将md5後的密碼儲存到資料庫,而不是儲存明文密碼,避免拖庫等事件發生後,明文密碼外洩。

防篡改:比如數字證書的防篡改,就用到了摘要算法。(當然還要結合數字簽名等手段)

在nodejs中,<code>crypto</code>子產品封裝了一系列密碼學相關的功能,包括摘要運算。基礎例子如下,非常簡單:

前面提到,将明文密碼儲存到資料庫是很不安全的,最不濟也要進行md5後進行儲存。比如使用者密碼是<code>123456</code>,md5運作後,得到<code>輸出:e10adc3949ba59abbe56e057f20f883e</code>。

這樣至少有兩個好處:

防内部攻擊:網站主人也不知道使用者的明文密碼,避免網站主人拿着使用者明文密碼幹壞事。

防外部攻擊:如網站被黑客入侵,黑客也隻能拿到md5後的密碼,而不是使用者的明文密碼。

示例代碼如下:

前面提到,通過對使用者密碼進行md5運算來提高安全性。但實際上,這樣的安全性是很差的,為什麼呢?

稍微修改下上面的例子,可能你就明白了。相同的明文密碼,md5值也是相同的。

也就是說,當攻擊者知道算法是md5,且資料庫裡存儲的密碼值為<code>e10adc3949ba59abbe56e057f20f883e</code>時,理論上可以可以猜到,使用者的明文密碼就是<code>123456</code>。

事實上,彩虹表就是這麼進行暴力破解的:事先将常見明文密碼的md5值運算好存起來,然後跟網站資料庫裡存儲的密碼進行比對,就能夠快速找到使用者的明文密碼。(這裡不探究具體細節)

那麼,有什麼辦法可以進一步提升安全性呢?答案是:密碼加鹽。

“加鹽”這個詞看上去很玄乎,其實原理很簡單,就是在密碼特定位置插入特定字元串後,再對修改後的字元串進行md5運算。

例子如下。同樣的密碼,當“鹽”值不一樣時,md5值的差異非常大。通過密碼加鹽,可以防止最初級的暴力破解,如果攻擊者事先不知道”鹽“值,破解的難度就會非常大。

通過密碼加鹽,密碼的安全性已經提高了不少。但其實上面的例子存在不少問題。

假設字元串拼接算法、鹽值已外洩,上面的代碼至少存在下面問題:

短鹽值:需要窮舉的可能性較少,容易暴力破解,一般采用長鹽值來解決。

鹽值固定:類似的,攻擊者隻需要把常用密碼+鹽值的hash值表算出來,就完事大吉了。

短鹽值自不必說,應該避免。對于為什麼不應該使用固定鹽值,這裡需要多解釋一下。很多時候,我們的鹽值是寫死到我們的代碼裡的(比如配置檔案),一旦壞人通過某種手段獲知了鹽值,那麼,隻需要針對這串固定的鹽值進行暴力窮舉就行了。

比如上面的代碼,當你知道鹽值是<code>abc</code>時,立刻就能猜到<code>51011af1892f59e74baf61f3d4389092</code>對應的明文密碼是<code>123456</code>。

那麼,該怎麼優化呢?答案是:随機鹽值。

示例代碼如下。可以看到,密碼同樣是123456,由于采用了随機鹽值,前後運算得出的結果是不同的。這樣帶來的好處是,多個使用者,同樣的密碼,攻擊者需要進行多次運算才能夠完全破解。同樣是純數字3位短鹽值,随機鹽值破解所需的運算量,是固定鹽值的1000倍。

簡單的說,就是兩段不同的字元串,經過md5運算後,得出相同的結果。

如有錯漏,敬請指出,歡迎多交流 :)

md5碰撞的一些例子

<a href="http://www.jianshu.com/p/c9089fd5b1ba">http://www.jianshu.com/p/c9089fd5b1ba</a>

md5 collision demo

<a href="http://www.mscs.dal.ca/~selinger/md5collision/">http://www.mscs.dal.ca/~selinger/md5collision/</a>

free password hash cracker

<a href="https://crackstation.net/">https://crackstation.net/</a>