在現代的網路中,身份認證是乙個經常會用到的功能,在身份認證過程中,有很多種方式可以保證使用者資訊的安全,而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...