天天看點

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

md5即message-digest algorithm 5(資訊-摘要算法 5),是網絡上廣泛使用的散列(hash)算法之一,可以實作将任意長度的數值映射為固定長度的較小數值。

  md5是一種常用的單向hash算法。它被廣泛用于以下幾個用途:

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

  2、存儲使用者密碼。将密碼哈希後的結果存儲在資料庫中,以做密碼比對。這是利用了其做為單向哈希的特點,從計算後的哈希值不能得到密碼。

  3、校驗資料正确性。将資料和資料哈希後的結果一并傳輸,用于檢驗傳輸過程中資料是否有損壞。這是利用了很難找到兩個不同的資料,其哈希結果一緻的特點。

  下面我們将說明為什麼對于上面三種用途, 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     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。 接下來發生的事情大家都知道了,就是使用者資料丢了!

  第三個用途裡一般會在需要哈希的資料中混入某些秘密,也就是計算公式為md5(secret key + data)。 但這樣并不适合用于驗證資料的完整性。這是因為,從理論上上來說,如果知道md5(secret key +x),即使不知道secret key的内容, 仍然可能通過對x的分析,計算得到md5(secret key +y),進而将x成功的替換成y,導緻接收方仍然認為資料是正确的。