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

(一)摘要的用途

好比一些提供下載的網站,在頁面上除了壓縮包的下載地址還提供了對應的MD5值。 咱們下載該壓縮包後能夠查看壓縮包的MD5值。 對比下載的壓縮包MD5值和網站提供的MD5值,若是兩個MD5值不一致,那麼說明該壓縮包不是官方提供的那個壓縮包,可能被替換成其餘文件或被修改過。好比蘋果開發工具的XCodeGhost事件。算法

MD5算法就是一種常見的摘要算法。該算法能夠生成壓縮包的一個128 bit 的二進制串。除了壓縮包,也能夠應用於其餘文件和字符串。好比數據庫中不會直接存儲帳號密碼,好比我就習慣將 密碼拼接一個無規律的字符串 而後計算出MD5摘要放入數據庫中(下面會講解緣由)。MD5常常和BASE64結合使用。數據庫

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

1,摘要

  • 摘要是哈希值,咱們經過散列算法好比MD5算法就能夠獲得這個哈希值。
  • 摘要只是用於驗證數據完整性和惟一性的哈希值,無論原始數據是什麼樣的,獲得的哈希值都是固定長度的。
  • 無論原始數據是什麼樣的,獲得的哈希值都是固定長度的,也就是說摘要並非原始數據加密後的密文,只是一個驗證身份的令牌。因此咱們沒法經過摘要解密獲得原始數據。

2,加密

加密是經過 「加密算法」 將 "明文" 加密成 「密文」。 咱們能夠經過 「密鑰」 和 「解密算法」 將 「密文」 還原成 「明文」。安全

3,摘要的理解誤區

錯誤的理解:bash

  • 經過加密算法獲得信息摘要。
  • 能夠經過對信息摘要這個加密結果進行解密獲得原始數據。

錯誤糾正:工具

  • 獲得摘要的算法是散列算法,沒有所謂的 「加密」 、「解密」 的說法,這些說法其實都是不嚴謹的,雖然在不少書上都說這麼描述的。
  • 摘要只是驗證身份的令牌,咱們沒法經過摘要還原出原始數據。

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

1,MD5算法簡介

MD5是用於計算摘要的散列算法,計算結果是 固定長度爲 128bit 的二進制串。不是加密算法。開發工具

2,MD5算法不是經常使用於帳戶密碼的加密嗎?

這樣理解是不嚴謹的,由於咱們也是用MD5計算出帳戶密碼的摘要,經過這個摘要是沒法還原出帳戶的原始密碼的。由於摘要只是個驗證身份的令牌,不能經過令牌還原出原始數據。網站

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

MD5算法是不可逆的,咱們沒法從算法入手還原出MD5算法處理前的結果。因爲MD5是信息-摘要算法,經過摘要是沒法獲得原始數據的,因此解密這一說法自己就是錯誤的。編碼

4,栗子講解

雖然MD5算法不可逆,也沒法經過摘要還原出原始數據,但這不表明安全性就是無懈可擊的。加密

因爲字符串經過MD5計算的摘要是惟一的,那麼MD5字典隨着時間積累保存愈來愈多的MD5記錄,經過窮舉這個字典就能夠很簡單地找到你的密碼。spa

好比下面這個網站就保存了不少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存入數據庫
複製代碼
相關文章
相關標籤/搜索