關(guān)于HMAC加密算法解析

HMAC加密算法,全稱為“Hash Message Authentication Code”,中文名“散列消息鑒別碼”,主要是利用哈希算法,以一個(gè)密鑰和一個(gè)消息為輸入,生成一個(gè)消息摘要作為輸出。一般的,消息鑒別碼用于驗(yàn)證傳輸于兩個(gè)共 同享有一個(gè)密鑰的單位之間的消息。HMAC算法 可以與任何迭代散列函數(shù)捆綁使用。MD5 和 SHA-1 就是這種散列函數(shù)。HMAC 還可以使用一個(gè)用于計(jì)算和確認(rèn)消息鑒別值的密鑰。

關(guān)于HMAC加密算法解析

HMAC算法,散列消息鑒別碼,是基于密鑰的 Hash 算法的認(rèn)證協(xié)議。它的實(shí)現(xiàn)原理是,用公開函數(shù)和密鑰產(chǎn)生一個(gè)固定長(zhǎng)度的值作為認(rèn)證標(biāo)識(shí),用這個(gè)標(biāo)識(shí)鑒別消息的完整性。使用一個(gè)密鑰生成一個(gè)固定大小的小數(shù)據(jù)塊,即 MAC,并將其加入到消息中,然后傳輸。接收方利用與發(fā)送方共享的密鑰進(jìn)行鑒別認(rèn)證等。

這種結(jié)構(gòu)的主要作用是:

不用修改就可以使用適合的散列函數(shù),而且散列函數(shù)在軟件方面表現(xiàn)的很好, 并且源碼是公開和通用的。

可以保持散列函數(shù)原有的性能而不致使其退化。

可以使得基于合理的關(guān)于底層散列函數(shù)假設(shè)的消息鑒別機(jī)制的加密強(qiáng)度分析 便于理解。

當(dāng)發(fā)現(xiàn)或需要運(yùn)算速度更快或更安全的散列函數(shù)時(shí),可以很容易的實(shí)現(xiàn)底層 散列函數(shù)的替換。

定義 HMAC算法 需要一個(gè)加密用散列函數(shù)(表示為 H)和一個(gè)密鑰 K。我們假設(shè) H 是 一個(gè)將數(shù)據(jù)塊用一個(gè)基本的迭代壓縮函數(shù)來(lái)加密的散列函數(shù)。我們用 B 來(lái)表示數(shù)據(jù)塊的字長(zhǎng)。(以上提到的散列函數(shù)的分割數(shù)據(jù)塊字長(zhǎng) B = 64),用 L 來(lái)表示散列函數(shù)的輸出數(shù)據(jù)字長(zhǎng)(MD5中 L = 16 , SHA-1 中 L = 20)。鑒別密鑰的長(zhǎng)度可以是小于等于數(shù)據(jù)塊字長(zhǎng)的任何正整數(shù)值。應(yīng)用程序中使用的密鑰長(zhǎng)度若是比 B 大,則首先用使用散列函數(shù) H 作用于它,然后用 H 輸出的 L 長(zhǎng)度字符串作為在 HMAC 中實(shí)際使用的密鑰。一般情況下,推薦的最小密鑰 K 長(zhǎng)度是 L 個(gè)字長(zhǎng)。(與 H 的輸出數(shù)據(jù)長(zhǎng)度相等)。

我們將定義兩個(gè)固定且不同的字符串 ipad,opad:(‘i’,‘o’表示內(nèi)部與外部)
ipad = the byte 0x36 repeated B times
opad = the byte 0x5C repeated B times
計(jì)算‘text’的 HMAC:
H (K XOR opad, H (K XOR ipad, text))

計(jì)算步驟

在密鑰 K 后面添加 0 來(lái)創(chuàng)建一個(gè)子長(zhǎng)為 B 的字符串。(例如,如果 K 的字長(zhǎng)是 20 字節(jié),B=60 字節(jié),則 K 后會(huì)加入 44 個(gè)零字節(jié)0x00)

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

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

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

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

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

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

密鑰

用于 HMAC 的密鑰可以是任意長(zhǎng)度(比 B 長(zhǎng)的密鑰將首先被 H 處理)。但當(dāng)密鑰 長(zhǎng)度小于 L 時(shí),會(huì)降低函數(shù)的安全強(qiáng)度。長(zhǎng)度大于 L 的密鑰也是可以的,但額外的長(zhǎng)度并不能顯著的提高函數(shù)的安全強(qiáng)度。

密鑰必須隨機(jī)選取(或使用強(qiáng)大的基于隨機(jī)種子的偽隨機(jī)生成方法),并且要周期性的更新。目前的攻擊沒有指出一個(gè)有效的更換密鑰的頻率,因?yàn)槟切┕魧?shí)際上并不可行。然而,周期性更新密鑰是一個(gè)對(duì)付函數(shù)和密鑰所存在的潛在缺陷的基本的安全措施,并可以降低泄漏密鑰帶來(lái)的危害。

HMAC算法

定義HMAC需要一個(gè)加密用散列函數(shù)(表示為H,可以是MD5或者SHA-1)和一個(gè)密鑰K。我們用B來(lái)表示數(shù)據(jù)塊的字節(jié)數(shù)。(以上所提到的散列函數(shù)的分割數(shù)據(jù)塊字長(zhǎng)B=64),用L來(lái)表示散列函數(shù)的輸出數(shù)據(jù)字節(jié)數(shù)(MD5中L=16,SHA-1中L=20)。鑒別密鑰的長(zhǎng)度可以是小于等于數(shù)據(jù)塊字長(zhǎng)的任何正整數(shù)值。應(yīng)用程序中使用的密鑰長(zhǎng)度若是比B大,則首先用使用散列函數(shù)H作用于它,然后用H輸出的L長(zhǎng)度字符串作為在HMAC中實(shí)際使用的密鑰。一般情況下,推薦的最小密鑰K長(zhǎng)度是L個(gè)字節(jié)。

我們將定義兩個(gè)固定且不同的字符串ipad,opad:(‘i','o'標(biāo)志內(nèi)部與外部)

ipad = the byte 0x36 重復(fù) B 次

opad = the byte 0x5C 重復(fù) B 次.

計(jì)算‘text'的HMAC:

HMAC?。?H( K XOR opad, H(K XOR ipad, text))

即為以下步驟:

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

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

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

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

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

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

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

HMAC的典型應(yīng)用

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

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

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

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

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