hmac

hmac

HMAC是密鑰相關的哈希運算訊息認證碼,HMAC運算利用哈希算法,以一個密鑰和一個訊息為輸入,生成一個訊息摘要作為輸出。

基本介紹

  • 中文名:哈希訊息認證碼
  • 外文名:Hash-based Message Authentication Code
  • 縮寫:HMAC
  • 概述 :HMAC是密鑰相關的哈希運算
  • 運算作用:驗證TPM接受的授權數
簡介,運算作用,算法表示,HMAC運算步驟,HMAC的套用,典型套用,認證流程,安全性淺析,

簡介

運算作用

(1)驗證TPM接受的授權數據和認證數據;
(2)確認TPM接受到的命令請求是已授權的請求,並且,命令在傳送的過程中沒有被改動過。
定義HMAC需要一個加密用散列函式(表示為H,可以是MD5或者SHA-1)和一個密鑰K。我們用B來表示數據塊的位元組數。(以上所提到的散列函式的分割數據塊字長B=64),用L來表示散列函式的輸出數據位元組數(MD5中L=16,SHA-1中L=20)。鑑別密鑰的長度可以是小於等於數據塊字長的任何正整數值。應用程式中使用的密鑰長度若是比B大,則首先用使用散列函式H作用於它,然後用H輸出的L長度字元串作為在HMAC中實際使用的密鑰。一般情況下,推薦的最小密鑰K長度是L個位元組

算法表示

算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))
H 代表所採用的HASH算法(如SHA-256)
K 代表認證密碼
Ko 代表HASH算法的密文
M 代表一個訊息輸入
B 代表H中所處理的塊大小,這個大小是處理塊大小,而不是輸出hash的大小
如,SHA-1和SHA-256 B = 64
SHA-384和SHA-512 B = 128
L 表示hash的大小
Opad 用0x5c重複B次
Ipad 用0x36重複B次
Apad 用0x878FE1F3重複(L/4)次

HMAC運算步驟

First-Hash = H(Ko XOR Ipad || (data to auth))
Second-Hash = H(Ko XOR Opad || First-Hash)
(1) 在密鑰K後面添加0來創建一個字長為B的字元串。(例如,如果K的字長是20位元組,B=64位元組,則K後會加入44個零位元組0x00)
(2) 將上一步生成的B字長的字元串與ipad做異或運算。
(3) 將數據流text填充至第二步的結果字元串中。
(4) 用H作用於第三步生成的數據流。
(5) 將第一步生成的B字長字元串與opad做異或運算。
(6) 再將第四步的結果填充進第五步的結果中。
(7) 用H作用於第六步生成的數據流,輸出最終結果

HMAC的套用

hmac主要套用在身份驗證中,它的使用方法是這樣的:
(1) 客戶端發出登錄請求(假設是瀏覽器的GET請求)
(2) 伺服器返回一個隨機值,並在會話中記錄這個隨機值
(3) 客戶端將該隨機值作為密鑰,用戶密碼進行hmac運算,然後提交給伺服器
(4) 伺服器讀取用戶資料庫中的用戶密碼和步驟2中傳送的隨機值做與客戶端一樣的hmac運算,然後與用戶傳送的結果比較,如果結果一致則驗證用戶合法
在這個過程中,可能遭到安全攻擊的是伺服器傳送的隨機值和用戶傳送的hmac結果,而對於截獲了這兩個值的黑客而言這兩個值是沒有意義的,絕無獲取用戶密碼的可能性,隨機值的引入使hmac只在當前會話中有效,大大增強了安全性和實用性。大多數的語言都實現了hmac算法,比如php的mhash、python的hmac.py、java的MessageDigest類,在web驗證中使用hmac也是可行的,用js進行md5運算的速度也是比較快的。

典型套用

HMAC的一個典型套用是用在“質疑/應答”(Challenge/Response)身份認證中。

認證流程

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

安全性淺析

由上面的介紹,我們可以看出,HMAC算法更象是一種加密算法,它引入了密鑰,其安全性已經不完全依賴於所使用的HASH算法,安全性主要有以下幾點保證:
(1) 使用的密鑰是雙方事先約定的,第三方不可能知道。由3.2介紹的套用流程可以看出,作為非法截獲信息的第三方,能夠得到的信息只有作為“挑戰”的隨機數和作為“回響”的HMAC結果,無法根據這兩個數據推算出密鑰。由於不知道密鑰,所以無法仿造出一致的回響。

相關詞條

熱門詞條

聯絡我們