HMAC算法及其应用
HMAC算法及其應用
- MAC
- HMAC
- HMAC的應用
- HMAC實現舉例
MAC
在現代的網絡中,身份認證是一個經常會用到的功能,在身份認證過程中,有很多種方式可以保證用戶信息的安全,而MAC(message authentication code)就是一種常用的方法。
消息認證碼是對消息進行認證并確認其完整性的技術。通過使用發送者和接收者之間共享的密鑰,就可以識別出是否存在偽裝和篡改行為。
MAC是通過MAC算法+密鑰+要加密的信息一起計算得出的。
同hash算法(消息摘要)相比,消息摘要只能保證消息的完整性,即該消息摘要B是這個消息A生成的。而MAC算法能夠保證消息的正確性,即判斷確實發的是消息A而不是消息C。
同公私鑰體系相比,因為MAC的密鑰在發送方和接收方是一樣的,所以發送方和接收方都可以來生成MAC,而公私鑰體系因為將公鑰和私鑰分開,所以增加了不可抵賴性。
MAC有很多實現方式,比較通用的是基于hash算法的MAC,比如今天我們要講的HMAC。還有一種是基于分組密碼的實現,比如(OMAC, CBC-MAC and PMAC)。
HMAC
HMAC 是Keyed-Hashing for Message Authentication的縮寫。HMAC的MAC算法是hash算法,它可以是MD5, SHA-1或者 SHA-256,他們分別被稱為HMAC-MD5,HMAC-SHA1, HMAC-SHA256。
HMAC用公式表示:
H(K XOR opad, H(K XOR ipad, text))
其中
H:hash算法,比如(MD5,SHA-1,SHA-256)
B:塊字節的長度,塊是hash操作的基本單位。這里B=64。
L:hash算法計算出來的字節長度。(L=16 for MD5, L=20 for SHA-1)。
K:共享密鑰,K的長度可以是任意的,但是為了安全考慮,還是推薦K的長度>B。當K長度大于B時候,會先在K上面執行hash算法,將得到的L長度結果作為新的共享密鑰。 如果K的長度<B, 那么會在K后面填充0x00一直到等于長度B。
text: 要加密的內容
opad:外部填充常量,是 0x5C 重復B次。
ipad: 內部填充常量,是0x36 重復B次。
XOR: 異或運算。
計算步驟如下:
HMAC的應用
hmac主要應用在身份驗證中,如下是它的使用過程:
在這個過程中,可能遭到安全攻擊的是服務器發送的隨機值和用戶發送的hmac結果,而對于截獲了這兩個值的黑客而言這兩個值是沒有意義的,絕無獲取用戶密碼的可能性,隨機值的引入使hmac只在當前會話中有效,大大增強了安全性和實用性。
HMAC實現舉例
/* ** Function: hmac_md5 */void hmac_md5(text, text_len, key, key_len, digest) unsigned char* text; /* pointer to data stream */ int text_len; /* length of data stream */ unsigned char* key; /* pointer to authentication key */ int key_len; /* length of authentication key */ caddr_t digest; /* caller digest to be filled in */{MD5_CTX context;unsigned char k_ipad[65]; /* inner padding -* key XORd with ipad*/unsigned char k_opad[65]; /* outer padding -* key XORd with opad*/unsigned char tk[16];int i;/* if key is longer than 64 bytes reset it to key=MD5(key) */if (key_len > 64) {MD5_CTX tctx;MD5Init(&tctx);MD5Update(&tctx, key, key_len);MD5Final(tk, &tctx);key = tk;key_len = 16;}/** the HMAC_MD5 transform looks like:** MD5(K XOR opad, MD5(K XOR ipad, text))** where K is an n byte key* ipad is the byte 0x36 repeated 64 times* opad is the byte 0x5c repeated 64 times* and text is the data being protected*//* start out by storing key in pads */bzero( k_ipad, sizeof k_ipad);bzero( k_opad, sizeof k_opad);bcopy( key, k_ipad, key_len);bcopy( key, k_opad, key_len);/* XOR key with ipad and opad values */for (i=0; i<64; i++) {k_ipad[i] ^= 0x36;k_opad[i] ^= 0x5c;}/** perform inner MD5*/MD5Init(&context); /* init context for 1st* pass */MD5Update(&context, k_ipad, 64) /* start with inner pad */MD5Update(&context, text, text_len); /* then text of datagram */MD5Final(digest, &context); /* finish up 1st pass *//** perform outer MD5*/MD5Init(&context); /* init context for 2nd* pass */MD5Update(&context, k_opad, 64); /* start with outer pad */MD5Update(&context, digest, 16); /* then results of 1st* hash */MD5Final(digest, &context); /* finish up 2nd pass */ }更多精彩內容且看:
- 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
- java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程
更多教程請參考flydean的博客
總結
以上是生活随笔為你收集整理的HMAC算法及其应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女巫攻击及其防范
- 下一篇: ERC20 Short Address