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章有介紹。大致原理是使用者搜尋出的多個網頁需要按照一定的重要程度 即後面講的權重 排序,每個網頁的權重由所有鏈結到它的其他網...