天天看點

MD5 到底算不算一種加密算法?

一旦提到加密算法,經常有人會有這樣的疑問:MD5 到底算不算一種加密算法呢?

在回答這個問題之前,我們需要先弄清楚兩點:

  • 什麼是加密算法?
  • 什麼是 MD5?

1、什麼是加密算法?

資料加密的基本過程就是對原來為明文的檔案或資料按某種算法進行處理,使其成為不可讀的一段代碼為“密文”,使其隻能在輸入相應的密鑰之後才能顯示出原容,通過這樣的途徑來達到保護資料不被非法人竊取、閱讀的目的。 該過程的逆過程為解密,即将該編碼資訊轉化為其原來資料的過程。

-- 來自《百度百科》

使用密碼學可以達到以下三個目的:

  • 資料保密性:防止使用者的資料被竊取或洩露;
  • 資料完整性:防止使用者傳輸的資料被篡改;
  • 身份驗證:確定資料來源與合法的使用者。

加密算法分類

常見的加密算法大體可以分為兩大類:對稱加密和非對稱加密。

  • 對稱加密

對稱加密算法就是用一個秘鑰進行加密和解密。

MD5 到底算不算一種加密算法?
  • 非對稱加密

與對稱加密算法不同的是,進行加密與解密使用的是不同的秘鑰,有一個公鑰-私鑰對,秘鑰正确才可以正常的進行加解密。

MD5 到底算不算一種加密算法?

2、什麼是MD5?

MD5算法:MD5全稱Message Digest Algorithm 5,即消息摘要算法第5版。

MD5 以 512位分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,算法的輸出由四個32位分組組成,将這四個32位分組級聯後将生成一個128位散列值。

MD5算法的主要特點:

  • 長度固定

MD5加密後值固定長度是128位,使用32個16進制數字進行表示。

  • 單向性

如果告訴原始消息,算法是MD5,疊代次數=1的情況下,我們一樣可以得到一摸一樣的消息摘要,但是反過來卻不行。

  • 不可逆

在不知道原始消息的前提下,是無法憑借16個位元組的消息摘要(Message Digest),還原出原始的消息的。

下面這個消息摘要,你知道他的原始資訊是什麼嗎?

Message Digest = '454e2624461c206380f9f088b1e55fae'      

其實,原始資訊是以下長長的字元串:

93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXug
OoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3
CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5z
fhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZ
OEmH0nOnH/0onD      
  • 恒定性

如果按照以上示例的原始資訊,大家與我計算出來的消息摘要不一樣,那肯定你是使用了一個假的 MD5 工具,哈哈哈。

當原始消息恒定時,每次運作MD5産生的消息摘要都是恒定不變的,無論是誰來計算,結果都應該是一樣的。

  • 不可預測性

讓我們再來嘗試一次,「不可逆」中應用到的原始消息的最後一個字母'D',修改成'E',如下所示:

93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXug
OoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3
CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5z
fhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZ
OEmH0nOnH/0onE      

那經 MD5 後産生的消息摘要,是不是和 '454e2624461c206380f9f088b1e55fae' 很相似呢?

讓大家失望了,産生的消息摘要沒有一絲一毫的關聯性,新的消息摘要如下所示:

Message Digest = '8796ed5412b84ff5c4769d080b4a89a2'      

聊到這裡,突然想到一個有意思的問題:

MD5是32位的,理論上是有限的,而世界上的資料是無限的,那會不會生成重複的MD5值?

是不是也有同學産生相似的疑問呢?

理論上來講,當然會生成重複的MD5值。

分享一個經典的例子:

  • 資料源1:

    d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f89 55ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5b d8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70

  • 資料源2:

    d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f89 55ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5b d8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70

它們竟然有着共同的MD5值(☞ 注意看,資料源1、2是存在很多細節不同的):

79054025255fb1a26e4bc422aef54eb4
複制代碼      

3、MD5是加密算法嗎?

MD5計算,對原始消息(Message)做有損的壓縮計算,無論消息(輸入值)的長度位元組是多少,是1億位元組還是1個位元組,都會生成一個固定長度(128位/16位元組)的消息摘要(輸出值)。

也就是說,MD5 算法和加密算法都可以将資訊轉換為另外一種内容,但是,MD5 算法對比 加密算法 缺少了解密過程。

好比一頭山羊,被層層加工制作成一包包風幹羊肉,這個就是一次MD5操作。這種加工過程,勢必将羊身體N多部位有損失,故無法通過羊肉幹再複原出一頭山羊...
MD5 到底算不算一種加密算法?