摘要與加密的區別(以MD5演算法為例)

suhuanzhen發表於2019-03-04

(一)摘要的用途

比如一些提供下載的網站,在頁面上除了壓縮包的下載地址還提供了對應的MD5值。 我們下載該壓縮包後可以檢視壓縮包的MD5值。 對比下載的壓縮包MD5值和網站提供的MD5值,如果兩個MD5值不一致,那麼說明該壓縮包不是官方提供的那個壓縮包,可能被替換成其他檔案或被修改過。比如蘋果開發工具的XCodeGhost事件。

MD5演算法就是一種常見的摘要演算法。該演算法可以生成壓縮包的一個128 bit 的二進位制串。除了壓縮包,也可以應用於其他檔案和字串。比如資料庫中不會直接儲存賬號密碼,比如我就習慣將 密碼拼接一個無規律的字串 然後計算出MD5摘要放入資料庫中(下面會講解原因)。MD5經常和BASE64結合使用。

(二)摘要和加密是兩個概念

1,摘要

  • 摘要是雜湊值,我們通過雜湊演算法比如MD5演算法就可以得到這個雜湊值。
  • 摘要只是用於驗證資料完整性和唯一性的雜湊值,不管原始資料是什麼樣的,得到的雜湊值都是固定長度的。
  • 不管原始資料是什麼樣的,得到的雜湊值都是固定長度的,也就是說摘要並不是原始資料加密後的密文,只是一個驗證身份的令牌。所以我們無法通過摘要解密得到原始資料。

2,加密

加密是通過 “加密演算法” 將 "明文" 加密成 “密文”。 我們可以通過 “金鑰” 和 “解密演算法” 將 “密文” 還原成 “明文”。

3,摘要的理解誤區

錯誤的理解:

  • 通過加密演算法得到資訊摘要。
  • 可以通過對資訊摘要這個加密結果進行解密得到原始資料。

錯誤糾正:

  • 得到摘要的演算法是雜湊演算法,沒有所謂的 “加密” 、“解密” 的說法,這些說法其實都是不嚴謹的,雖然在很多書上都說這麼描述的。
  • 摘要只是驗證身份的令牌,我們無法通過摘要還原出原始資料。

(三)MD5演算法不是加密演算法

1,MD5演算法簡介

MD5是用於計算摘要的雜湊演算法,計算結果是 固定長度為 128bit 的二進位制串。不是加密演算法。

2,MD5演算法不是常用於賬戶密碼的加密嗎?

這樣理解是不嚴謹的,因為我們也是用MD5計算出賬戶密碼的摘要,通過這個摘要是無法還原出賬戶的原始密碼的。因為摘要只是個驗證身份的令牌,不能通過令牌還原出原始資料。

3,MD5演算法不可逆,那麼網上的那些MD5線上加解密怎麼看?

MD5演算法是不可逆的,我們無法從演算法入手還原出MD5演算法處理前的結果。由於MD5是資訊-摘要演算法,通過摘要是無法得到原始資料的,所以解密這一說法本身就是錯誤的。

4,栗子講解

雖然MD5演算法不可逆,也無法通過摘要還原出原始資料,但這不代表安全性就是無懈可擊的。

由於字串通過MD5計算的摘要是唯一的,那麼MD5字典隨著時間積累儲存越來越多的MD5記錄,通過窮舉這個字典就可以很簡單地找到你的密碼。

比如下面這個網站就儲存了很多MD5記錄,也就是這個網站有一個MD5字典,我們輸入通過MD5演算法的123的摘要。通過窮舉這個字典,馬上就找到這個摘要對應的資訊是123。

image.png

以上不是通過破解MD5演算法,也不是還原資訊摘要的方式得到原始資訊。而是通過窮舉MD5字典,字典裡面儲存著類似 (摘要) 202CB962AC59075B964B07152D234B70:(資訊)123這樣的記錄,我們才知道該摘要對應的資訊是123。

5,防止MD5字典窮舉 :提高資訊的長度來提高字典窮舉的複雜度

1)分析

窮舉字典法要求字典儲存MD5演算法的資訊和計算後的摘要,字典是有限的,那麼多資訊不可能都存下來,所以一般只會儲存長度比較短的資訊和對應的資訊摘要。一般情況下密碼長度不會很長,所以通過窮舉字典基本上都可以找到密碼摘要對應的資訊。

退一步說,即使MD5字典儲存了很長的資訊和對應的資訊摘要,那麼說明這個字典是儲存的記錄是非常非常多的,即使窮舉的話也要花非常漫長的時間才能窮舉到該記錄。

所以我們可以通過提高資訊的長度,這樣MD5字典存在該資訊的 資訊-摘要 記錄的可能性很低,即使存在也要耗費非常多的時間去窮舉。

2)實現思路

以前寫Rails應用的時候,先將資訊進行BASE64編碼,這樣得到的就是一個很長的字串。

現在寫SSM應用的時候,我沒有采取先用BASE64進行編碼的方案,而是 "密碼 + 任意字串"再用MD5演算法計算出摘要。比如 密碼是password,那麼我會下面這麼做:

1,result = MD5演算法(password + "adfasdfsdafsadasou89ZXcj@#$aKJdjklj;easd../dSF.,";)
2,將result存入資料庫
複製程式碼

相關文章