HMAC演算法及其應用

2021-09-22 18:51:27 字數 3165 閱讀 3535

在現代的網路中,身份認證是乙個經常會用到的功能,在身份認證過程中,有很多種方式可以保證使用者資訊的安全,而mac(message authentication code)就是一種常用的方法。

訊息認證碼是對訊息進行認證並確認其完整性的技術。通過使用傳送者和接收者之間共享的金鑰,就可以識別出是否存在偽裝和篡改行為。

mac是通過mac演算法+金鑰+要加密的資訊一起計算得出的。

同hash演算法(訊息摘要)相比,訊息摘要只能保證訊息的完整性,即該訊息摘要b是這個訊息a生成的。而mac演算法能夠保證訊息的正確性,即判斷確實發的是訊息a而不是訊息c。

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

mac有很多實現方式,比較通用的是基於hash演算法的mac,比如今天我們要講的hmac。還有一種是基於分組密碼的實現,比如(omac, cbc-mac and pmac)。

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的長度計算步驟如下:

將0x00填充到k的後面,直到其長度等於b。

將步驟1的結果跟 ipad做異或。

將要加密的資訊附在步驟2的結果後面。

呼叫h方法。

將步驟1的結果跟opad做異或。

將步驟4的結果附在步驟5的結果後面。

呼叫h方法。

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

客戶端發出登入請求(假設是瀏覽器的get請求)

伺服器返回乙個隨機值,並在會話中記錄這個隨機值

客戶端將該隨機值作為金鑰,使用者密碼進行hmac運算,然後提交給伺服器

伺服器讀取使用者資料庫中的使用者密碼和步驟2中傳送的隨機值做與客戶端一樣的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 */

/** 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++)

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

}

訊息摘要演算法 HMAC演算法

hmac是一種使用單向雜湊函式來構造訊息認證碼的方法,其中hmac中的h就是hash的意思,以乙個金鑰和乙個訊息為輸入,生成乙個訊息摘要作為輸出。或者簡單點說,hmac就是資訊在hash的時候,按照一定規則在資訊裡新增了一些關鍵字,增加了hash破解的難度。hmac中所使用的單向雜湊函式並不僅限於一...

KMP演算法及其應用

今天學習了乙個新演算法 kmp演算法 其實很久以前學過早忘了 kmp演算法是用於處理字串問題的演算法。參考matrix67的部落格 kmp演算法詳解 matrix67 假設有字串a和b,要求判斷b是否是a的字串 其實就是對於每個i,求最大的j,使得ai j 1 i與b 1 j 一一匹配 能匹配j指標...

hashlib 和 hmac 演算法的區別

md5 hashlib.md5 md5.update password salt md5.hexdigest h hmac.new key,password,digestmod md5 key 和 password 必須是 bytes型別 h.hexdigest 區別 1.hashlib 中的md5...