閱讀64 返回首頁    go 阿裏雲 go 技術社區[雲棲]


為什麼應該放棄或減少使用MD5

MD5即Message-Digest Algorithm 5(信息-摘要算法 5),是網絡上廣泛使用的散列(Hash)算法之一,可以實現將任意長度的數值映射為固定長度的較小數值。

  MD5是一種常用的單向Hash算法。它被廣泛用於以下幾個用途:

  1、檢查數據是否一致。將兩地存儲的數據進行哈希,比較結果,如果結果一致就無需再進行數據比對。這是利用了其“抵抗衝突”(collision- resistant)的能力,兩個不同的數據,其哈希值隻有很小的幾率一致。相當多數據服務,尤其是網盤服務,利用類似的做法來檢測重複數據,避免重複上傳。

  2、存儲用戶密碼。將密碼哈希後的結果存儲在數據庫中,以做密碼匹配。這是利用了其做為單向哈希的特點,從計算後的哈希值不能得到密碼。

  3、校驗數據正確性。將數據和數據哈希後的結果一並傳輸,用於檢驗傳輸過程中數據是否有損壞。這是利用了很難找到兩個不同的數據,其哈希結果一致的特點。

  下麵我們將說明為什麼對於上麵三種用途, 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,導致接收方仍然認為數據是正確的。

最後更新:2017-04-02 15:14:44

  上一篇:go Cocoa教學:Windows OOP與Cocoa MVC之對比
  下一篇:go 為激發應用開發商興趣,鮑爾默展示自用Surface