(一)摘要的用途
比如一些提供下載的網站,在頁面上除了壓縮包的下載地址還提供了對應的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。
以上不是通過破解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存入資料庫
複製程式碼