日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HMAC算法及其应用

發(fā)布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HMAC算法及其应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

HMAC算法及其應(yīng)用

  • MAC
  • HMAC
  • HMAC的應(yīng)用
  • HMAC實現(xiàn)舉例

MAC

在現(xiàn)代的網(wǎng)絡(luò)中,身份認證是一個經(jīng)常會用到的功能,在身份認證過程中,有很多種方式可以保證用戶信息的安全,而MAC(message authentication code)就是一種常用的方法。

消息認證碼是對消息進行認證并確認其完整性的技術(shù)。通過使用發(fā)送者和接收者之間共享的密鑰,就可以識別出是否存在偽裝和篡改行為。

MAC是通過MAC算法+密鑰+要加密的信息一起計算得出的。

同hash算法(消息摘要)相比,消息摘要只能保證消息的完整性,即該消息摘要B是這個消息A生成的。而MAC算法能夠保證消息的正確性,即判斷確實發(fā)的是消息A而不是消息C。

同公私鑰體系相比,因為MAC的密鑰在發(fā)送方和接收方是一樣的,所以發(fā)送方和接收方都可以來生成MAC,而公私鑰體系因為將公鑰和私鑰分開,所以增加了不可抵賴性。

MAC有很多實現(xiàn)方式,比較通用的是基于hash算法的MAC,比如今天我們要講的HMAC。還有一種是基于分組密碼的實現(xiàn),比如(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:塊字節(jié)的長度,塊是hash操作的基本單位。這里B=64。
L:hash算法計算出來的字節(jié)長度。(L=16 for MD5, L=20 for SHA-1)。
K:共享密鑰,K的長度可以是任意的,但是為了安全考慮,還是推薦K的長度>B。當K長度大于B時候,會先在K上面執(zhí)行hash算法,將得到的L長度結(jié)果作為新的共享密鑰。 如果K的長度<B, 那么會在K后面填充0x00一直到等于長度B。
text: 要加密的內(nèi)容
opad:外部填充常量,是 0x5C 重復(fù)B次。
ipad: 內(nèi)部填充常量,是0x36 重復(fù)B次。
XOR: 異或運算。

計算步驟如下:

  • 將0x00填充到K的后面,直到其長度等于B。
  • 將步驟1的結(jié)果跟 ipad做異或。
  • 將要加密的信息附在步驟2的結(jié)果后面。
  • 調(diào)用H方法。
  • 將步驟1的結(jié)果跟opad做異或。
  • 將步驟4的結(jié)果附在步驟5的結(jié)果后面。
  • 調(diào)用H方法。
  • HMAC的應(yīng)用

    hmac主要應(yīng)用在身份驗證中,如下是它的使用過程:

  • 客戶端發(fā)出登錄請求(假設(shè)是瀏覽器的GET請求)
  • 服務(wù)器返回一個隨機值,并在會話中記錄這個隨機值
  • 客戶端將該隨機值作為密鑰,用戶密碼進行hmac運算,然后提交給服務(wù)器
  • 服務(wù)器讀取用戶數(shù)據(jù)庫中的用戶密碼和步驟2中發(fā)送的隨機值做與客戶端一樣的hmac運算,然后與用戶發(fā)送的結(jié)果比較,如果結(jié)果一致則驗證用戶合法。
  • 在這個過程中,可能遭到安全攻擊的是服務(wù)器發(fā)送的隨機值和用戶發(fā)送的hmac結(jié)果,而對于截獲了這兩個值的黑客而言這兩個值是沒有意義的,絕無獲取用戶密碼的可能性,隨機值的引入使hmac只在當前會話中有效,大大增強了安全性和實用性。

    HMAC實現(xiàn)舉例

    /* ** 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 */ }

    更多精彩內(nèi)容且看:

    • 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級賬本,以太坊,Libra,比特幣等持續(xù)更新
    • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
    • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
    • java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細文章教程

    更多教程請參考flydean的博客

    總結(jié)

    以上是生活随笔為你收集整理的HMAC算法及其应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。