專題:什麼是MD5?

一、概念
MD5在軟件行業是再常見不過的一個詞了,即使你從沒使用過它,也不知道它到底是個什麼東西,但你肯定聽過這個詞。

那麼到底什麼是MD5呢?是加密算法嗎?不是的,它是一種信息摘要算法,它可以從一個字符串或一個文件中按照一定的規則生成一個特殊的字符串(這個特殊的字符串就被稱之爲摘要,我理解就是從文件中摘一些信息片段加工而來),並且一個文件所對應的MD5摘要是固定的,當文件內容變化後,其MD5值也會不一樣(雖然理論上來說也有可能會一樣,但概率極小),因此,在應用中經常使用MD5值來驗證一段數據有沒有被篡改。比如,在數據的發送方將原始數據生成出MD5值,然後把原始數據連同其MD5值一起傳給接收方,接收該收到數據後,先將原始數據用MD5算法生成摘要信息,然後再將此摘要信息與發送方發過來的摘要信息進行比較,如果一致就認爲原始數據沒有被修改,否則原始數據就是被修改過了。

二、特點
MD5值有幾個特點:

1、它是一段固定長度的數據,即128bit的由“0”和“1”組成的一段二進制數據。無論原始數據是多長或多短,其MD5值都是128bit。

2、通常(或者叫行業規定),這段128bit的數據,按4bit一組分成32組,每一組按16進制來計算其值,並以字符的形式輸出每個值。比如一組數據按16進制計算出來的值是0-9,打印出來也是0-9,如果計算出來的值是a-f,如果直接打印的話將會是10-15,在java中可以使用String.format("%02x", bytes[i])方法來將16進制的 a-f 打印成字母“a-f”,最終這個128bit的數據將會被打印成一個32位的字符串。所以我們通常所說的MD5值就是指這串32位的由“0-9,a-f”所組成的字符串。如果你看到某個MD5不是32位,或發現其中含有“0~f”之外的字符,那肯定是個錯誤的MD5值。

3、確定性,一個原始數據的MD5值是唯一的,同一個原始數據不可能會計算出多個不同的MD5值。

4、碰撞性,原始數據與其MD5值並不是一一對應的,有可能多個原始數據計算出來的MD5值是一樣的,這就是碰撞。

5、不可逆。也就是說如果告訴你一個MD5值,你是無法通過它還原出它的原始數據的,這不是你的技術不夠牛,這是由它的算法所決定的。因爲根據第4點,一個給定的MD5值是可能對應多個原始數據的,並且理論上講是可以對應無限多個原始數據,所有無法確定到底是由哪個原始數據產生的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章