簡述HMAC加密算法
眾所周知,Mac是Apple筆記本電腦的縮寫,它是一款……開個(gè)玩笑,除了筆記本電腦之外,MAC還是一種著名的散列函數(shù),而我們今天的主角則是MAC算法的一種——HMAC。

HMAC算法簡介
HMAC是一種使用單向散列函數(shù)來構(gòu)造消息認(rèn)證碼(MAC)的方法,其中H代表了hash(哈希)的意思。HMAC中所使用的單向散列函數(shù)并不是僅僅局限于一種,任何獲得認(rèn)證的高強(qiáng)度的單向散列函數(shù)都可以用于HMAC的計(jì)算。
使用單向散列函數(shù)SHA-1、SHA-224、SHA-256、SHA-384、SHA-512等構(gòu)造的HMAC,分別稱為HMAC-SHA1、HMAC-SHA224、HAMC-SHA256、HMAC-SHA384、HAMC-SHA512。
HMAC算法的工作步驟

1: 秘鑰填充
若秘鑰的長度比單向散列函數(shù)的分組長度短,則需要在秘鑰的末尾以0填充,直到其長度達(dá)到單向散列函數(shù)的分組長度為止。
若秘鑰的長度比單向散列函數(shù)的分組長度長,則首先通過單向散列函數(shù)計(jì)算出秘鑰的散列值,然后將這個(gè)散列值用作HMAC的秘鑰。
2: 填充后的秘鑰與ipad進(jìn)行“異或”處理
ipad是將比特系列00110110(即0x36)不斷循環(huán)直到達(dá)到單向散列函數(shù)分組長度的比特系列,其中ipad中的i是inner(內(nèi)部)的意思。異或運(yùn)算之后得到的值是一個(gè)與單向散列函數(shù)分組長度相同,且與“秘鑰”相關(guān)的比特系列,我們將這一比特系列稱為ipadkey。
3: 與消息組合
將ipadkey與消息進(jìn)行組合,即將ipadkey附加在消息的開頭。
4: 計(jì)算散列值(或hash值)
將步驟3組織的數(shù)據(jù)輸入到單向散列函數(shù),計(jì)算出散列值hash1。
5: 填充后的秘鑰與opad進(jìn)行“異或”處理
opad是將比特系列01011100(即0x5C)不斷循環(huán)反復(fù)直到達(dá)到單向散列函數(shù)的分組長度所形成的比特系列,其中opad中的o是outer(外部)的意思。異或運(yùn)算之后得到的值是一個(gè)與單向散列函數(shù)分組長度相同,且與“秘鑰”相關(guān)的比特系列,我們將這一比特系列稱為opadkey。
6: 與散列值組合
將步驟4計(jì)算的散列值拼在opadkey的后面。
7: 計(jì)算最終的散列值
將步驟6的結(jié)果輸入單向散列函數(shù),計(jì)算得到的散列值,即為最終的MAC值。
注意:
- MAC值是一個(gè)與輸入的消息、秘鑰都相關(guān)的固定長度的比特系列;
- HMAC的計(jì)算涉及到兩個(gè)特殊的key(ipadkey、opadkey);
- HMAC的MAC值的長度與選擇的單向散列函數(shù)直接相關(guān),單向散列函數(shù)的分組長度是多長,MAC值就多長。

HMAC算法的缺點(diǎn)
首先計(jì)算初始消息的指印(消息摘要),然后用對(duì)稱密鑰加密,只有發(fā)送方和接收方知道這個(gè)密鑰,從而使接收方可以肯定消息來自正確的發(fā)送方,沒有在中途被篡改。但是會(huì)存在以下問題:
- HMAC中假設(shè)只有發(fā)送方和接收方知道,存在密鑰交換問題。
- 即使解決了密鑰交換問題,HMAC也不適用于多個(gè)接收方的情形。這是因?yàn)?,為了用HMAC產(chǎn)生MAC,就要利用對(duì)稱密鑰,而對(duì)稱密鑰是雙方共享的:一個(gè)發(fā)送方,一個(gè)接收方。
- 接收方是如何知道消息來自發(fā)送方,而不是來自其他的接收方。所有接收方都知道這個(gè)對(duì)稱密鑰,因此很可能以發(fā)送方的身份發(fā)一個(gè)假消息,用HMAC準(zhǔn)備這個(gè)消息的MAC,發(fā)送消息和MAC,就像合法的發(fā)送方一樣,這是無法阻止和檢測的。
- 如何證明MAC是A產(chǎn)生還是B產(chǎn)生的,A和B都知道這個(gè)對(duì)稱密鑰,雙方都有可能生成這個(gè)消息及其MAC。
免責(zé)聲明:素材源于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系刪稿。



