HMAC算法是一種基于密鑰的報文完整性的驗證方法 ,其安全性是建立在Hash加密算法基礎上的。它要求通信雙方共享密鑰、約定算法、對報文進行Hash運算,形成固定長度的認證碼。通信雙方通過認證碼的校驗來確定報文的合法性。 HMAC算法可以用來作加密、數字簽名、報文驗證等 。(我感覺實際情況中用HMAC做加密也是為的不可逆加密,不像用DES/AES這種可逆加密;感覺HMAC和隨機鹽Hash算法非常像)
一句話總結: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填充至第二步的結果字符串中。
(4) 用H作用于第三步生成的數據流。
(5) 將第一步生成的B字長字符串與opad做異或運算。
(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算法的一個典型應用是用在“挑戰/響應”(Challenge/Response)身份認證中,認證流程如下:
(1) 先由客戶端向服務器發出一個驗證請求。
(2) 服務器接到此請求后生成一個隨機數并通過網絡傳輸給客戶端(此為挑戰)。
(3) 客戶端將收到的隨機數與自己的密鑰進行HMAC-SHA1運算并得到一個結果作為認證證據傳給服務器(此為響應)。
(4) 與此同時,服務器也使用該隨機數與存儲在服務器數據庫中的該客戶密鑰進行HMAC-SHA1運算,如果服務器的運算結果與客戶端傳回的響應結果相同,則認為客戶端是一個合法用戶 。
HMAC算法的安全性HMAC算法引入了密鑰,其安全性已經不完全依賴于所使用的HASH算法,安全性主要有以下幾點保證:
(1)使用的密鑰是雙方事先約定的,第三方不可能知道。由上面介紹應用流程可以看出,作為非法截獲信息的第三方,能夠得到的信息只有作為“挑戰”的隨機數和作為“響應”的HMAC結果,無法根據這兩個數據推算出密鑰。由于不知道密鑰,所以無法仿造出一致的響應。
(2)在HMAC算法的應用中,第三方不可能事先知道輸出(如果知道,不用構造輸入,直接將輸出送給服務器即可)。
(3) HMAC算法與一般的加密重要的區別在于它具有“瞬時”性,即認證只在當時有效,而加密算法被破解后,以前的加密結果就可能被解密。

相關推薦
[轉帖] 尋求合作與招聘
一篇文章帶您玩轉T113的ARM+RISC-V+DSP三核異構!
芯科科技EFR32ZG28 SoC技術解析與應用展望
第四屆“金領職場”高級人力資源洽談會
BOE(京東方)攜手京東發起百吋電視品牌聯盟發布會
實時系統編程學習
NVIDIA公布2026-2028年兩大GPU架構:搭配1TB HBM4e內存
視頻教程:Windows CE電源管理(Level 300)
電池儲能系統
小鵬汽車進入印度尼西亞市場
利用智能化遠程熱風扇控制器ADT7460的PWM3端同時驅動兩臺三線風扇
嵌入式Linux網絡開發 上
實時系統的實現
[公告]上海一合資汽車零部件公司招聘電子工程師
兼職PROTEL繪圖員(上海地區)
基于SMBus總線的智能溫度控制器MAX6641的典型應用電路
驅動一臺二線風扇的電路(智能化遠程熱風扇控制器ADT7460)
實時操作系統源代碼0.64.1b
嵌入式Linux在消費電子領域的發展與應用 上
[注意] 招電子技術員電子助理工程師!
實時操作系統Pencil2000微機版Beta1.0操作手冊
由智能化遠程熱風扇控制器ADT7460構成的計算機的散熱控制電路
負溫度系數
驅動一臺三線風扇的電路(智能化遠程熱風扇控制器ADT7460)
電動汽車充電技術與電池循環壽命助力電動汽車革命
嵌入式Linux在消費電子領域的發展與應用 下
頻譜擴展技術(FSS)中的參數選擇
嵌入式Linux方案概覽 下
Microgate 的自適應光學技術在深空探索中大顯身手
嵌入式Linux圖形界面開發 上