大家常聽到“MD5加密”、“對稱加密”、“非對稱加密”,那麼MD5屬於哪種加密演算法?
面試問這樣的問題,準是在給你挖坑。
"MD5加密"純屬口嗨,MD5不是加密演算法,是摘要演算法。
今天小碼甲帶大家梳理加密演算法、摘要演算法的定義和場景:
伸手黨先看答案:
加密演算法的目的,在於使別人無法成功檢視加密的資料,並且在需要的時候還可以對資料進行解密來重新檢視資料。
而MD5演算法是一種雜湊演算法,雜湊演算法的設計目的本身就決定了,它在大多數情況下都是不可逆的,即你通過雜湊演算法得到的資料,無法經過任何演算法還原回去。 所以既然不能將資料還原,也就不能稱之為解密;既然不能解密,那麼雜湊的過程自然也就不能稱作是[加密]了。
加密演算法
加密: 是以某種特殊的演算法改變原有的資訊,使得未授權的使用者即使獲得已加密的資訊,但因不知解密的方法,仍然無法瞭解資訊的內容。
解密:加密的逆過程為解密,即將該加密資訊轉化為其原來資訊的過程。
加密演算法分為對稱加密和非對稱加密,其中對稱加密演算法的加解密金鑰相同,非對稱加解密的金鑰不同。
HTTPS就同時用到非對稱加密和對稱加密,在連線建立的階段,使用非對稱加解密(傳輸金鑰), 在通訊階段使用對稱金鑰加解密資料。
摘要演算法
摘要演算法,又稱雜湊演算法、雜湊演算法。通過一個函式,將任意長度的內容轉換為一個固定長度的資料串。
摘要演算法之所以能指出資料是否被篡改,就是因為摘要函式是一個單向函式,計算很容易,但通過摘要(digest) 反推data卻非常困難,而且,對於原始資料做一個bit的修改,都會導致計算出的摘要完全不同。
使用迅雷下載某片的時候,下載站會順帶給你一個MD5校驗碼;
你找一個MD5校驗工具,對下載下來的檔案執行MD5演算法,將得到的雜湊值與下載站附帶的MD5值對比,如果值是相同的,說明從該網站下載的檔案沒有損壞。
HMAC
延伸聊一個結合了金鑰和雜湊功能的請求認證方案:
HMAC ( hash-based message authenticated code)
很多第三方平臺都採用這種授權認證方案,你回想一下,api平臺是不是經常給你一對AppID
Serect Key
Client & Server 都知曉一個私鑰
serect key
客戶端每次請求時,會針對(請求資料+ secret key)生成一個hash值
HMAC = hashFunc(secret key + message)
客戶端將雜湊值做為請求的一部分,一起傳送
當服務端收到請求, 對( 收到的請求+ 查到的
Serectkey'
)生成雜湊,將計算的雜湊值與請求中附帶的原雜湊值對比,如果相同,則認定請求來自受信Client,且請求未被篡改。
為什麼會有這樣的效果?
首先:Client 和Server的雜湊值相同,根據雜湊演算法的設計初衷,說明請求過程未被篡改;
另一方面也反推 Client 和Server使用了相同的Serect Key
, 而Serect Key
是私密資訊,故此處的Client不可抵賴。
還可以考慮在客戶端生成雜湊時加入timestamp時間戳(請求還要附帶這個時間戳),服務端收到後先對比伺服器時間戳與請求時間戳,限制15s內為有效請求,再對(請求資訊+ 時間戳+ serectkey)雜湊對比,避免重放攻擊。
總結
本文給出的示例: HTTPS、迅雷MD5校驗,足夠幫助你瞭解加密演算法和摘要演算法的設計目的。
- 加密演算法的目的是: 防止資訊被偷看
- 摘要演算法的目的是: 防止資訊被篡改
以後使用時候也能有的放矢,面試時也不會鬧出笑話。
最後給出的WebAPI授權方案HMAC
,算是金鑰+雜湊演算法結合的一個應用場景, 具備快速、自簽名的特點。