你是不是對MD5演算法有誤解?

大家常聽到「MD5加密」、「對稱加密」、「非對稱加密」,那麼MD5屬於哪種加密演算法?
面試問這樣的問題,準是在給你挖坑。

“MD5加密”純屬口嗨,MD5不是加密演算法,是摘要演算法。

今天小碼甲帶大家梳理加密演算法、摘要演算法的定義和場景:

伸手黨先看答案:

加密演算法的目的,在於使別人無法成功查看加密的數據,並且在需要的時候還可以對數據進行解密來重新查看數據。

而MD5演算法是一種哈希演算法,哈希演算法的設計目的本身就決定了,它在大多數情況下都是不可逆的,即你通過哈希演算法得到的數據,無法經過任何演算法還原回去。 所以既然不能將數據還原,也就不能稱之為解密;既然不能解密,那麼哈希的過程自然也就不能稱作是[加密]了。

加密演算法

加密: 是以某種特殊的演算法改變原有的資訊,使得未授權的用戶即使獲得已加密的資訊,但因不知解密的方法,仍然無法了解資訊的內容。

解密:加密的逆過程為解密,即將該加密資訊轉化為其原來資訊的過程。

加密演算法分為對稱加密和非對稱加密,其中對稱加密演算法的加解密密鑰相同,非對稱加解密的密鑰不同。

HTTPS就同時用到非對稱加密和對稱加密,在連接建立的階段,使用非對稱加解密(傳輸密鑰), 在通訊階段使用對稱密鑰加解密數據。

摘要演算法

摘要演算法,又稱哈希演算法、散列演算法。通過一個函數,將任意長度的內容轉換為一個固定長度的數據串。

摘要演算法之所以能指出數據是否被篡改,就是因為摘要函數是一個單向函數,計算很容易,但通過摘要(digest) 反推data卻非常困難,而且,對於原始數據做一個bit的修改,都會導致計算出的摘要完全不同。

使用迅雷下載某片的時候,下載站會順帶給你一個MD5校驗碼;
你找一個MD5校驗工具,對下載下來的文件執行MD5演算法,將得到的哈希值與下載站附帶的MD5值對比,如果值是相同的,說明從該網站下載的文件沒有損壞。

HMAC

延伸聊一個結合了密鑰和哈希功能的請求認證方案:
HMAC ( hash-based message authenticated code)

很多第三方平台都採用這種授權認證方案,你回想一下,api平台是不是經常給你一對AppID Serect Key

  1. Client & Server 都知曉一個私鑰serect key

  2. 客戶端每次請求時,會針對(請求數據+ secret key)生成一個hash值
    HMAC = hashFunc(secret key + message)

  3. 客戶端將哈希值做為請求的一部分,一起發送

  4. 當服務端收到請求, 對( 收到的請求+ 查到的Serectkey')生成哈希,將計算的哈希值與請求中附帶的原哈希值對比,如果相同,則認定請求來自受信Client,且請求未被篡改。

為什麼會有這樣的效果?

首先:Client 和Server的哈希值相同,根據哈希演算法的設計初衷,說明請求過程未被篡改;

另一方面也反推 Client 和Server使用了相同的Serect Key , 而Serect Key是私密資訊,故此處的Client不可抵賴。

還可以考慮在客戶端生成哈希時加入timestamp時間戳(請求還要附帶這個時間戳),服務端收到後先對比伺服器時間戳與請求時間戳,限制15s內為有效請求,再對(請求資訊+ 時間戳+ serectkey)哈希對比,避免重放攻擊。

總結

本文給出的示例: HTTPS、迅雷MD5校驗,足夠幫助你了解加密演算法和摘要演算法的設計目的。

  • 加密演算法的目的是: 防止資訊被偷看
  • 摘要演算法的目的是: 防止資訊被篡改

以後使用時候也能有的放矢,面試時也不會鬧出笑話。

最後給出的WebAPI授權方案HMAC,算是密鑰+哈希演算法結合的一個應用場景, 具備快速、自簽名的特點。

Tags: