HMAC MD5演算法原理及實現

2021-06-05 18:58:06 字數 3817 閱讀 1003

md5和sha-1是一種hash函式,又稱雜湊函式,類似於指紋的應用。在網路安全協議中,雜湊函式用來處理電子簽名,將冗長的簽名檔案壓縮為一段獨特的數字資訊,像指紋鑑別身份一樣保證原來數字簽名檔案的合法性和安全性。經過這些演算法的處理,原始資訊即使只更動乙個字母,對應的壓縮資訊也會變為截然不同的「指紋」,這就保證了經過處理資訊的唯一性。為電子商務等提供了數字認證的可能性。

而hmac演算法需要乙個加密用雜湊函式(表示為h,可以是md5或者sha-1)和乙個金鑰k。我們用b來表示資料塊的位元組數。(以上所提到的雜湊函式的分割資料塊字長b=64),用l來表示雜湊函式的輸出資料位元組數(md5中l=16,sha-1中l=20)。鑑別金鑰的長度可以是小於等於資料塊字長的任何正整數值。應用程式中使用的金鑰長度若是比b大,則首先用使用雜湊函式h作用於它,然後用h輸出的l長度字串作為在hmac中實際使用的金鑰。一般情況下,推薦的最小金鑰k長度是l個位元組。

我們將定義兩個固定且不同的字串ipad,opad:(『i','o'標誌內部與外部)

ipad = the byte 0x36 重複 b 次

opad = the byte 0x5c 重複 b 次.

計算『text'的hmac:

hmac = h( k xor opad, h(k xor ipad, text))

即為以下步驟:

(1) 在金鑰k後面新增0來建立乙個字長為b的字串。(例如,如果k的字長是20

位元組,b=64位元組,則k後會加入44個零位元組0x00)

(2) 將上一步生成的b字長的字串與ipad做異或運算。

(3) 將資料流text填充至第二步的結果字串中。

(4) 用h作用於第三步生成的資料流。

(5) 將第一步生成的b字長字串與opad做異或運算。

(6) 再將第四步的結果填充進第五步的結果中。

(7) 用h作用於第六步生成的資料流,輸出最終結果

hmac的典型應用

hmac的乙個典型應用是用在「挑戰/響應」(challenge/response)身份認證中,認證流程如下[3]:

(1) 先由客戶端向伺服器發出乙個驗證請求。

(2) 伺服器接到此請求後生成乙個隨機數(text)並通過網路傳輸給客戶端(此為挑戰)。

(3) 客戶端將收到的隨機數提供給epass,由epass使用該隨機數(text)與儲存在epass中的金鑰(k)進行hmac-md5運算並得到乙個結果作為認證證據傳給伺服器(此為響應)。

(4) 與此同時,伺服器也使用該隨機數與儲存在伺服器資料庫中的該客戶金鑰進行hmac-md5運算,如果伺服器的運算結果與客戶端傳回的響應結果相同,則認為客戶端是乙個合法使用者

/*

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

}test vectors (trailing '\0' of a character string not included in test):

key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b

key_len = 16 bytes

data = "hi there"

data_len = 8 bytes

digest = 0x9294727a3638bb1c13f48ef8158bfc9d

key = "jefe"

data = "what do ya want for nothing?"

data_len = 28 bytes

digest = 0x750c783e6ab0b503eaa86e310a5db738

key = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

key_len 16 bytes

data = 0xdddddddddddddddddddd...

..dddddddddddddddddddd...

..dddddddddddddddddddd...

..dddddddddddddddddddd...

..dddddddddddddddddddd

data_len = 50 bytes

digest = 0x56be34521d144c88dbb8c733f0e8b3f6

MD5加密演算法原理及實現

md5訊息摘要演算法,屬hash演算法一類。md5演算法對輸入任意長度的訊息進行執行,產生乙個128位的訊息摘要。以下所描述的訊息長度 填充資料都以位 bit 為單位,位元組序為小端位元組。演算法原理 1 資料填充 對訊息進行資料填充,使訊息的長度對512取模得448,設訊息長度為x,即滿足x mo...

MD5加密演算法原理及實現

md5訊息摘要演算法,屬hash演算法一類。md5演算法對輸入任意長度的訊息進行執行,產生乙個128位的訊息摘要。以下所描述的訊息長度 填充資料都以位 bit 為單位,位元組序為小端位元組。演算法原理 1 資料填充 對訊息進行資料填充,使訊息的長度對512取模得448,設訊息長度為x,即滿足x mo...

PageRank演算法原理及實現

pagerank演算法原理介紹 pagerank演算法是google的網頁排序演算法,在 the top ten algorithms in data mining 一書中第6章有介紹。大致原理是使用者搜尋出的多個網頁需要按照一定的重要程度 即後面講的權重 排序,每個網頁的權重由所有鏈結到它的其他網...