前段時間被MAC和HMAC搞的稀里糊塗,不知道什么時候用,也不知道他們有什么區別,在此記錄一哈。
先比較下他們的特征
- hash只能驗證數據完整性,無法保證數據防篡改,計算過程無密鑰參與。
- MAC既可以驗證數據完整性,也可以驗證數據是由原始發送方發出的,計算過程有密鑰參與,使用對稱加密算法構造(一般使用ecb模式,即不需要iv向量),mac值為8字節(密鑰長度的一半)。
- HMAC是mac的一種,可以驗證數據完整性,也可以驗證數據是由原始發送方發出的,使用hash函數來構造,hmac輸出長度與hash長度一樣(32字節)。
算法流程
MAC(參考銀聯標准)
* SM4 mac計算
* 1.數據不為16的倍數,需要補0
* 2.將數據16個字節進行異或,再將異或的結果與下一個16個字節異或,一直到最后
* 3.將異或運算后的最后16個字節 轉換成32 個HEXDECIMAL:
* 4.取前16 個字節用MAK加密
* 5.將加密后的結果與后16 個字節異或
* 6.用異或的結果TEMP BLOCK 再進行一次SM4密鑰算法運算
* 7.取運算后結果前8個字節作為MAC值。
為什么取前8字節作為mac值?
mac計算的最后結果與密鑰長度一致(一般是16字節),猜,應該是sm4加密是可以解密得到原文,而hash的特征是不可逆,所以這里只取前8字節。
HMAC
iPad=一個字節(byte)的 0x36 重復 64 次;
oPad=一個字節(byte)的 0x5C 重復 64 次
操作步驟如下:
- 在密鑰 K 后面填充 0,使其成為長度為 64byte 的字符串。
- 用第一步得到的 64byte 的字符串與 iPad 作按位異或;
- 將消息 Message 附加到第二步產生的 64byte 字符串后面;
- 對第三步產生的數據流用散列函數 SM3 計算消息摘要;
- 用第一步得到的 64byte 的字符串與 oPad 作按位異或;
- 將第四步生成的消息摘要附加到第五步的 64byte 字符串之后;
- 對第六步產生的數據流用散列函數 SM3 計算消息摘要,作為輸出
mac函數可以用hash函數來構造,就叫做hmac,也可以使用對稱加密函數來構造mac,如sm4(也叫sm4mac)。