HMAC加密算法

HMAC加密算法是一種基于密鑰的報文完整性的驗(yàn)證方法,其安全性是建立在Hash加密算法基礎(chǔ)上的。它要求通信雙方共享密鑰、約定算法、對報文進(jìn)行Hash運(yùn)算,形成固定長度的認(rèn)證碼。通信雙方通過認(rèn)證碼的校驗(yàn)來確定報文的合法性。HMAC加密算法可以用來作加密、數(shù)字簽名、報文驗(yàn)證等。

HMAC加密算法的定義

HMAC加密算法是一種執(zhí)行“校驗(yàn)和”的算法,它通過對數(shù)據(jù)進(jìn)行“求和”來檢查數(shù)據(jù)是否被更改了。在發(fā)送數(shù)據(jù)以前,HMAC加密算法對數(shù)據(jù)塊和雙方約定的公鑰進(jìn)行“散列操作”,以生成稱為“摘要”的東西,附加在待發(fā)送的數(shù)據(jù)塊中。當(dāng)數(shù)據(jù)和摘要到達(dá)其目的地時,就使用HMAC加密算法來生成另一個校驗(yàn)和,如果兩個數(shù)字相匹配,那么數(shù)據(jù)未被做任何篡改。否則,就意味著數(shù)據(jù)在傳輸或存儲過程中被某些居心叵測的人作了手腳。

HMAC加密算法的定義用公式表示如下:

HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))

HMAC加密算法的加密步驟

(1) 在密鑰K后面添加0來創(chuàng)建一個字長為B的字符串。(例如,如果K的字長是20字節(jié),B=64字節(jié),則K后會加入44個零字節(jié)0x00)

(2) 將上一步生成的B字長的字符串與ipad做異或運(yùn)算。

(3) 將數(shù)據(jù)流text填充至第二步的結(jié)果字符串中。

(4) 用H作用于第三步生成的數(shù)據(jù)流。

(5) 將第一步生成的B字長字符串與opad做異或運(yùn)算。

(6) 再將第四步的結(jié)果填充進(jìn)第五步的結(jié)果中。

(7) 用H作用于第六步生成的數(shù)據(jù)流,輸出最終結(jié)果 。

HMAC加密算法的典型應(yīng)用

HMAC加密算法的一個典型應(yīng)用是用在“挑戰(zhàn)/響應(yīng)”(Challenge/Response)身份認(rèn)證中,認(rèn)證流程如下:

(1) 先由客戶端向服務(wù)器發(fā)出一個驗(yàn)證請求。

(2) 服務(wù)器接到此請求后生成一個隨機(jī)數(shù)并通過網(wǎng)絡(luò)傳輸給客戶端(此為挑戰(zhàn))。

(3) 客戶端將收到的隨機(jī)數(shù)提供給ePass,由ePass使用該隨機(jī)數(shù)與存儲在ePass中的密鑰進(jìn)行HMAC-MD5運(yùn)算并得到一個結(jié)果作為認(rèn)證證據(jù)傳給服務(wù)器(此為響應(yīng))。

(4) 與此同時,服務(wù)器也使用該隨機(jī)數(shù)與存儲在服務(wù)器數(shù)據(jù)庫中的該客戶密鑰進(jìn)行HMAC-MD5運(yùn)算,如果服務(wù)器的運(yùn)算結(jié)果與客戶端傳回的響應(yīng)結(jié)果相同,則認(rèn)為客戶端是一個合法用戶 。

HMAC加密算法的安全性

HMAC加密算法引入了密鑰,其安全性已經(jīng)不完全依賴于所使用的HASH算法,安全性主要有以下幾點(diǎn)保證:

(1)使用的密鑰是雙方事先約定的,第三方不可能知道。由上面介紹應(yīng)用流程可以看出,作為非法截獲信息的第三方,能夠得到的信息只有作為“挑戰(zhàn)”的隨機(jī)數(shù)和作為“響應(yīng)”的HMAC結(jié)果,無法根據(jù)這兩個數(shù)據(jù)推算出密鑰。由于不知道密鑰,所以無法仿造出一致的響應(yīng)。

(2)在HMAC加密算法的應(yīng)用中,第三方不可能事先知道輸出(如果知道,不用構(gòu)造輸入,直接將輸出送給服務(wù)器即可)。

(3) HMAC加密算法與一般的加密重要的區(qū)別在于它具有“瞬時”性,即認(rèn)證只在當(dāng)時有效,而加密算法被破解后,以前的加密結(jié)果就可能被解密。

小知識之HMAC:

HMAC是密鑰相關(guān)的哈希運(yùn)算消息認(rèn)證碼(Hash-based Message Authentication Code),HMAC運(yùn)算利用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出。