搜尋本站文章

2012年9月25日 星期二

你所不知道的:為什麼應該放棄或減少使用 MD5?


MD5 是一種常用的單向雜湊演算法。它被廣泛用於以下幾個用途:
  • 檢查資料是否一致:將兩地存儲的資料進行雜湊,比較結果,如果結果一致就無需再進行資料比對。這是利用了其「抵抗衝突」(collision- resistant)的能力,兩個不同的資料,其雜湊值只有很小的幾率一致。相當多資料服務,尤其是網路硬碟服務,利用類似的做法來檢測重復資料,避免重複上傳。
  • 存儲使用者密碼:將密碼雜湊後的結果存儲在資料庫中,以做密碼匹配。這是利用了其做為單向雜湊的特點,從計算後的雜湊值不能得到密碼。
  • 校驗資料正確性:將資料和資料雜湊後的結果一併傳輸,用於檢驗傳輸過程中資料是否有損壞。這是利用了很難找到兩個不同的資料,其雜湊結果一致的特點。
下面我們將說明為什麼對於上面三種用途,MD5 都不適用。

第一個用途尤其可怕。這個用途的最大的問題是,MD5 在現實中已經被發現有相當多的資料都可能導致衝突。舉例而言,如下兩段資料的 MD5 雜湊值就是完全一樣的。

資料 1

4d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87
d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18
af bf a2 00 a8 28 4b f3 6e 8e 4b 55 b3 5f 42 75
93 d8 49 67 6d a0 d1 55 5d 83 60 fb 5f 07 fe a2

資料 2

4d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87
d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18
af bf a2 02 a8 28 4b f3 6e 8e 4b 55 b3 5f 42 75
93 d8 49 67 6d a0 d1 d5 5d 83 60 fb 5f 07 fe a2

輸出相同的 MD5 雜湊

008ee33a9d58b51cfeb425b0959121c9

這意味著,如果使用者提供資料 1,伺服器已經存儲資料 2。通過簡單的 MD5 雜湊方式檢查重複,伺服器上為使用者保存的資料就是 2。接下來發生的事情大家都知道了,就是使用者資料丟了!

第二個用途很容易遭到 rainbow table 攻擊,和明文存儲密碼的實質區別不大。

第三個用途裡一般會在需要雜湊的資料中混入某些秘密,也就是計算公式為 md5(secret key + data)。但這樣並不適合用於驗證資料的完整性。這是因為,從理論上上來說,如果知道 md5(secret key + X),即使不知道 secret key 的內容,仍然可能通過對 X 的分析,計算得到 md5(secret key + Y),從而將 X 成功的替換成 Y,導致接收方仍然認為資料是正確的。

===============================================
創用 CC 授權條款
Related Posts Plugin for WordPress, Blogger...

沒有留言:

張貼留言

1、本留言處歡迎多加留言交流,但不歡迎垃圾留言及廣告留言
2、留言時可以使用部份 HTML 標記
3、對於教學文章介紹或軟體使用有問題歡迎提出,若站長沒回應表示不清楚該問題的解決方案
4、留言時請勿留下電子郵件,以免因搜尋引擎爬文而造成您的困擾,且站長不會寄相關郵件給您,僅會在留言區提供解決方案
5.站長保留不當刪除留言的權力,若造成不便尚請見諒