用MD5儲存密碼的安全防範

2022-02-26 15:43:06 字數 1539 閱讀 4838

兩個不同的且均可正常執行的exe程式檔案,具有相同的md5校驗值,這不僅僅是理論上的可能,而是現實,已經有人寫出了這樣的兩個程式了,

關於md5碰撞,據說是山東大學王小雲教授的一篇報告震驚國際密碼學界,他找到了一種能夠比較快速的計算md5碰撞的演算法。(最早我聽到這個報道的時候還以為是忽悠呢,俺中國人被忽悠怕了落下的後遺症:d,後來看到實實在在的例子和程式了才確信)

何為md5碰撞呢?就是說,存在並能夠找到兩個或兩個以上的不同資料(d1,d2…dn)進行md5摘要運算後具有相同結果。來看乙個比較著名的例子:

(資料1)

d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89

55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b

d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0

e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70

(資料2)

d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89

55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b

d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0

e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70

這兩組256位字串的資料有6個位置的字元不同(紅色標示部分),

但是都具有相同的md5值:79054025255fb1a26e4bc422aef54eb4.

也就是說,如果你的使用者系統以md5儲存密碼,如果某個帳號的密碼md5結果是79054025255fb1a26e4bc422aef54eb4,那麼真實的密碼可能是資料1,有可能是資料2,雖然我們常見的系統不會把密碼設的這麼長,但是不排除存在更短的md5碰撞的可能性。

1、檢測輸入的密碼長度,比如32位以內或20位以內,根據實際情況。超出長度範圍直接判斷為密碼錯誤。

2、檢測輸入的密碼是否為鍵盤字元,否則可能是偽造的密碼。

3、變換花樣,防止直接通過字典反查。通常使用者的密碼可能設定的比較短,如果直接儲存該短字串的md5值,無疑是很容易被查出來的。利於越長資料越不容易被字典查出的道理,我們可以在程式中,以原密碼的基礎上構造乙個較長的密碼,比如原密碼加上比較長的自定義字首、字尾、或其他變換演算法,總之呢要得到乙個較長的字串(建議至少弄到50字元以上),再md5結果存入資料庫。驗證密碼的時候也是相同步驟。這樣就大大降低了被字典反查的可能性。怎麼算,就充分發揮你的想像力了。(雅虎**的密碼就是這麼處理的,好像是加了十幾個字元的串)

如果做到了以上3點,我們系統的md5安全性就大大提公升了。

附幾個md5相關**:

密碼儲存 金鑰 密碼 md5 演算法

作為密碼,本身就是很嚴肅的問題。有些 為了方便直接把密碼存到資料庫中,資料庫被黑,所有使用者輕則被迫更改密碼,重則造成隱私財產損失。所以資料庫密碼一定要加密,用md5是一種不錯的選擇。現在很多 採用暴力破解md5,儲存常用密碼與md5對比的資料庫對md5加密後的密碼造成了威脅,雖說只可能破解小部分的...

用MD5雜湊值儲存密碼及密碼驗證登陸

1.註冊頁面通過form提交使用者相關資訊,然後將資訊儲存在資料庫中,為了讓密碼不是明密的形式儲存在資料庫中,在asp.net中可以採用md5的雜湊值進行處理後存入資料庫中方法如下 form登錄檔單提交 user.text 使用者名稱 password.text 密碼 public static s...

Shiro密碼的MD5加密 MD5鹽值加密

用md5加密演算法後,前台使用者輸入的字串如何使用md5加密,需要做的是將當前的realm 的credentialsmatcher屬性,替換為md5credentialsmatcher 由於md5credentialsmatcher已經過期了,推薦使用hashedcredentialsmatcher...