hmac

密鑰相關的哈希運算消息認證碼縮寫

HMAC是密鑰相關的哈希運算消息認證碼(Hash-based Message Authentication Code)的縮寫,由H.Krawezyk,M.Bellare,R.Canetti於1996年提出的一種基於Hash函數和密鑰進行消息認證的方法,並於1997年作為RFC2104被公布,並在IPSec和其他網路協議(如SSL)中得以廣泛應用,現在已經成為事實上的Internet安全標準。它可以與任何迭代散列函數捆綁使用。

產生背景


隨著Internet的不斷發展,網路安全問題日益突出。為了確保接收方所接收到的報文數據的完整性,人們採用消息認證來驗證上述性質。用來對消息進行認證的主要方式有以下3種:消息認證碼、散列函數和消息加密。
消息認證碼:它是一個需要密鑰的演演算法,可以對可變長度的消息進行認證,把輸出的結果作為認證符。
散列函數:它是將任意長度的消息映射成為定長的散列值的函數,以該散列值消息摘要)作為認證符。
消息加密:它將整個消息的密文作為認證符。
近年來,人們越來越感興趣於利用散列函數來設計MAC,原因有二:
①一般的散列函數的軟體執行速度比分組密碼的要快。
②密碼散列函數的庫代碼來源廣泛。
因此HMAC應運而生,HMAC是一種利用密碼學中的散列函數來進行消息認證的一種機制,所能提供的消息認證包括兩方面內容:
①消息完整性認證:能夠證明消息內容在傳送過程沒有被修改。
②信源身份認證:因為通信雙方共享了認證的密鑰,接收方能夠認證發送該數據的信源與所宣稱的一致,即能夠可靠地確認接收的消息與發送的一致。
HMAC是當前許多安全協議所選用的提供認證服務的方式,應用十分廣泛,並且經受住了多種形式攻擊的考驗。

設計目標


在HMAC規劃之初,就有以下設計目標:
1·不必修改而直接套用已知的散列函數,並且很容易得到軟體上執行速度較快的散列函數及其代碼。
2·若找到或需要更快或更安全的散列函數,能夠容易地代替原來嵌入的散列函數。
3·應保持散列函數的原來性能,不能因為嵌入在HMAC中而過分降低其性能。
4·對密鑰的使用和處理比較簡單。
5·如果已知嵌入的散列函數強度,則完全可以推斷出認證機制抵抗密碼分析的強度。

演演算法描述


在HMAC的定義中用到一個密碼散列函數H和一個密鑰K。假設H是一個能夠對明文進行分組循環壓縮的散列函數,B為散列函數的明文分組長度(byte),在上述的散列函數中B=64,L為散列函數的輸出長度(byte),MD5中L=16,SHA-1中L=20。認證密鑰K可以為任意長度,一般密鑰長度應大於明文分組的長度,將密鑰的第一次散列值作為HMAC真正使用的密鑰,密鑰的最小推薦長度為Lbytes。
再定義兩個不同的固定字元串ipad和opad如下(“i”和“o”表示內部和外部):
ipad=一個位元組(byte)的0x36重複B次;
opad=一個位元組(byte)的0x5C重複B次。
若以“text”作為要計算HMAC的明文,則作如下操作:
H(K XOR opad,H(K XOR ipad,text))
也就是說,操作步驟如下:
(1)在密鑰K後面填充0,使其成為長度為Bbyte的字元串;如:K是20bytes的字元串,B=64,則要填充44個位元組的0x00。
(2)用第一步得到的Bbyte的字元串與ipad作XOR(按位異或);
(3)將數據流text附加到第(2)步產生的Bbyte字元串後面;
(4)對第(3)產生的數據流用散列函數H計算消息摘要;
(5)用第一步得到的Bbyte的字元串與opad作XOR(按位異或);
(6)將第(4)生成的消息摘要附加到第(5)步的Bbyte字元串之後;
(7)對第(6)產生的數據流用散列函數H計算消息摘要,作為輸出。

演演算法密鑰


HMAC運算利用hash演演算法,以一個消息M和一個密鑰K作為輸入,生成一個定長的消息摘要作為輸出。HMAC演演算法利用已有的Hash函數,關鍵問題是如何使用密鑰。
HMAC的密鑰長度可以是任意大小,如果小於n(hash輸出值的大小),那麼將會消弱演演算法安全的強度。建議使用長度大於n的密鑰,但是採用長度大的密鑰並不意味著增強了函數的安全性。密鑰應該是隨機選取的,可以採用一種強偽隨機發生器,並且密鑰需要周期性更新,這樣可以減少散列函數弱密鑰的危險性以及已經暴露密鑰所帶來的破壞。

安全性


HMAC演演算法更象是一種加密演演算法,它引入了密鑰,其安全性已經不完全依賴於所使用的Hash演演算法,安全性主要有以下幾點保證。
(1)使用的密鑰是雙方事先約定的,第三方不可能知道。作為非法截獲信息的第三方,能夠得到的信息只有作為“挑戰”的隨機數和作為“響應”的HMAC結果,無法根據這兩個數據推算出密鑰。由於不知道密鑰,所以無法仿造出一致的響應。
(2)HMAC與一般的加密重要的區別在於它具有“瞬時"性,即認證只在當時有效,而加密演演算法被破解后,以前的加密結果就可能被解密。
HMAC的安全性依賴於散列函數H的密碼學屬性:①抗碰撞屬性;②當應用於一個單獨的消息分組時H的壓縮函數的消息認證屬性。

典型應用


HMAC的一個典型應用是用在“挑戰/響應”(Challenge/Response)身份認證中,認證流程如下:
(1)先由客戶端向伺服器發出一個驗證請求。
(2)伺服器接到此請求後生成一個隨機數並通過網路傳輸給客戶端(此為挑戰)。
(3)客戶端將收到的隨機數提供給ePass,由ePass使用該隨機數與存儲在ePass中的密鑰進行HMAC-MD5運算並得到一個結果作為認證證據傳給伺服器(此為響應)。
(4)與此同時,伺服器也使用該隨機數與存儲在伺服器資料庫中的該客戶密鑰進行HMAC-MD5運算,如果伺服器的運算結果與客戶端傳回的響應結果相同,則認為客戶端是一個合法用戶。