HMAC算法原理

HMAC算法是一種基於密鑰的報文完整性的驗證方法 ,其安全性是創建在Hash加密算法基礎上的。它要求通訊雙方共享密鑰、約定算法、對報文進行Hash運算,造成固定長度的認證碼。通訊雙方經過認證碼的校驗來肯定報文的合法性。 HMAC算法能夠用來做加密、數字簽名、報文驗證等 。(我感受實際狀況中用HMAC作加密也是爲的不可逆加密,不像用DES/AES這種可逆加密;感受HMAC和隨機鹽Hash算法很是像)java

一句話總結:HMAC是密鑰相關的哈希運算消息認證碼(Hash-based Message Authentication Code),HMAC運算利用哈希算法,以一個密鑰和一個消息爲輸入,生成一個消息摘要做爲輸出。算法

HMAC算法的定義

HMAC算法是一種執行「校驗和」的算法,它經過對數據進行「校驗」來檢查數據是否被更改了。在發送數據之前,HMAC算法對數據塊和雙方約定的公鑰進行「散列操做」,以生成稱爲「摘要」的東西,附加在待發送的數據塊中。當數據和摘要到達其目的地時,就使用HMAC算法來生成另外一個校驗和,若是兩個數字相匹配,那麼數據未被作任何篡改。不然,就意味着數據在傳輸或存儲過程當中被某些居心叵測的人做了手腳。數據庫

HMAC算法的定義用公式表示以下:安全

HMAC(K,M)=H((K’⊕opad)∣H((K’⊕ipad)∣M))服務器

HMAC算法的加密步驟

(1) 在密鑰K後面添加0 或者 對密鑰K用H進行處理 來建立一個字長爲B的字符串。(例如,若是K的字長是20字節,B=64字節,則K後會加入44個零字節0x00;若是K的字長是120字節,B=64字節,則會用H做用於K後產生64字節的字符串)網絡

(2) 將上一步生成的B字長的字符串與ipad作異或運算。加密

(3) 將數據流text填充至第二步的結果字符串中。spa

(4) 用H做用於第三步生成的數據流。code

(5) 將第一步生成的B字長字符串與opad作異或運算。blog

(6) 再將第四步的結果填充進第五步的結果中。

(7) 用H做用於第六步生成的數據流,輸出最終結果 。

用圖表示就是:

 

 

 

HMAC算法的僞碼實現
function hmac (key, message) {
if  (length(key) > blocksize) {
key = hash(key)  // keys longer than blocksize are shortened
}
if  (length(key) < blocksize) {
// keys shorter than blocksize are zero-padded (where ∥ is concatenation)
key = key  [  0x00  * (blocksize - length(key))]  // Where * is repetition.
}
o_pad = [  0x5c  * blocksize]  // Where blocksize is that of the underlying hash function
i_pad = [  0x36  * blocksize]
o_key_pad = o_pad  key  // Where ⊕ is exclusive or (XOR)
i_key_pad = i_pad  key
return  hash(o_key_pad  hash(i_key_pad  message))  // Where ∥ is concatenation
}
HMAC算法的典型應用

HMAC算法的一個典型應用是用在「挑戰/響應」(Challenge/Response)身份認證中,認證流程以下:

(1) 先由客戶端向服務器發出一個驗證請求。

(2) 服務器接到此請求後生成一個隨機數並經過網絡傳輸給客戶端(此爲挑戰)。

(3) 客戶端將收到的隨機數與本身的密鑰進行HMAC-SHA1運算並獲得一個結果做爲認證證據傳給服務器(此爲響應)。

(4) 與此同時,服務器也使用該隨機數與存儲在服務器數據庫中的該客戶密鑰進行HMAC-SHA1運算,若是服務器的運算結果與客戶端傳回的響應結果相同,則認爲客戶端是一個合法用戶 。

HMAC算法的安全性

HMAC算法引入了密鑰,其安全性已經不徹底依賴於所使用的HASH算法,安全性主要有如下幾點保證:

(1)使用的密鑰是雙方事先約定的,第三方不可能知道。由上面介紹應用流程能夠看出,做爲非法截獲信息的第三方,可以獲得的信息只有做爲「挑戰」的隨機數和做爲「響應」的HMAC結果,沒法根據這兩個數據推算出密鑰。因爲不知道密鑰,因此沒法仿造出一致的響應。

(2)在HMAC算法的應用中,第三方不可能事先知道輸出(若是知道,不用構造輸入,直接將輸出送給服務器便可)。

(3) HMAC算法與通常的加密重要的區別在於它具備「瞬時」性,即認證只在當時有效,而加密算法被破解後,之前的加密結果就可能被解密。

相關文章
相關標籤/搜索