【转】HMAC哈希消息认证码及算法原理
HMAC算法原理
HMAC算法是一種基于密鑰的報(bào)文完整性的驗(yàn)證方法?,其安全性是建立在Hash加密算法基礎(chǔ)上的。它要求通信雙方共享密鑰、約定算法、對(duì)報(bào)文進(jìn)行Hash運(yùn)算,形成固定長(zhǎng)度的認(rèn)證碼。通信雙方通過(guò)認(rèn)證碼的校驗(yàn)來(lái)確定報(bào)文的合法性。?HMAC算法可以用來(lái)作加密、數(shù)字簽名、報(bào)文驗(yàn)證等?。(我感覺(jué)實(shí)際情況中用HMAC做加密也是為的不可逆加密,不像用DES/AES這種可逆加密;感覺(jué)HMAC和隨機(jī)鹽Hash算法非常像)
一句話總結(jié):HMAC是密鑰相關(guān)的哈希運(yùn)算消息認(rèn)證碼(Hash-based Message Authentication Code),HMAC運(yùn)算利用哈希算法,以一個(gè)密鑰和一個(gè)消息為輸入,生成一個(gè)消息摘要作為輸出。
HMAC算法的定義
HMAC算法是一種執(zhí)行“校驗(yàn)和”的算法,它通過(guò)對(duì)數(shù)據(jù)進(jìn)行“校驗(yàn)”來(lái)檢查數(shù)據(jù)是否被更改了。在發(fā)送數(shù)據(jù)以前,HMAC算法對(duì)數(shù)據(jù)塊和雙方約定的公鑰進(jìn)行“散列操作”,以生成稱為“摘要”的東西,附加在待發(fā)送的數(shù)據(jù)塊中。當(dāng)數(shù)據(jù)和摘要到達(dá)其目的地時(shí),就使用HMAC算法來(lái)生成另一個(gè)校驗(yàn)和,如果兩個(gè)數(shù)字相匹配,那么數(shù)據(jù)未被做任何篡改。否則,就意味著數(shù)據(jù)在傳輸或存儲(chǔ)過(guò)程中被某些居心叵測(cè)的人作了手腳。
HMAC算法的定義用公式表示如下:
HMAC(K,M)=H((K’⊕opad)∣H((K’⊕ipad)∣M))
HMAC算法的加密步驟
(1) 在密鑰K后面添加0 或者 對(duì)密鑰K用H進(jìn)行處理 來(lái)創(chuàng)建一個(gè)字長(zhǎng)為B的字符串。(例如,如果K的字長(zhǎng)是20字節(jié),B=64字節(jié),則K后會(huì)加入44個(gè)零字節(jié)0x00;如果K的字長(zhǎng)是120字節(jié),B=64字節(jié),則會(huì)用H作用于K后產(chǎn)生64字節(jié)的字符串)
(2) 將上一步生成的B字長(zhǎng)的字符串與ipad做異或運(yùn)算。
(3) 將數(shù)據(jù)流text填充至第二步的結(jié)果字符串中。
(4) 用H作用于第三步生成的數(shù)據(jù)流。
(5) 將第一步生成的B字長(zhǎng)字符串與opad做異或運(yùn)算。
(6) 再將第四步的結(jié)果填充進(jìn)第五步的結(jié)果中。
(7) 用H作用于第六步生成的數(shù)據(jù)流,輸出最終結(jié)果 。
用圖表示就是:
?
?
?
HMAC算法的偽碼實(shí)現(xiàn)
| function?hmac?(key,?message)?{ if?(length(key)?>?blocksize)?{ key?=?hash(key)?// keys longer than blocksize are shortened } if?(length(key)?<?blocksize)?{ // keys shorter than blocksize are zero-padded (where ∥ is concatenation) key?=?key?∥?[?0x00?*?(blocksize?-?length(key))]?// Where * is repetition. } o_pad?=?[?0x5c?*?blocksize]?// Where blocksize is that of the underlying hash function i_pad?=?[?0x36?*?blocksize] o_key_pad?=?o_pad?⊕?key?// Where ⊕ is exclusive or (XOR) i_key_pad?=?i_pad?⊕?key return?hash(o_key_pad?∥?hash(i_key_pad?∥?message))?// Where ∥ is concatenation } |
HMAC算法的典型應(yīng)用
HMAC算法的一個(gè)典型應(yīng)用是用在“挑戰(zhàn)/響應(yīng)”(Challenge/Response)身份認(rèn)證中,認(rèn)證流程如下:
(1) 先由客戶端向服務(wù)器發(fā)出一個(gè)驗(yàn)證請(qǐng)求。
(2) 服務(wù)器接到此請(qǐng)求后生成一個(gè)隨機(jī)數(shù)并通過(guò)網(wǎng)絡(luò)傳輸給客戶端(此為挑戰(zhàn))。
(3) 客戶端將收到的隨機(jī)數(shù)與自己的密鑰進(jìn)行HMAC-SHA1運(yùn)算并得到一個(gè)結(jié)果作為認(rèn)證證據(jù)傳給服務(wù)器(此為響應(yīng))。
(4) 與此同時(shí),服務(wù)器也使用該隨機(jī)數(shù)與存儲(chǔ)在服務(wù)器數(shù)據(jù)庫(kù)中的該客戶密鑰進(jìn)行HMAC-SHA1運(yùn)算,如果服務(wù)器的運(yùn)算結(jié)果與客戶端傳回的響應(yīng)結(jié)果相同,則認(rèn)為客戶端是一個(gè)合法用戶 。
HMAC算法的安全性
HMAC算法引入了密鑰,其安全性已經(jīng)不完全依賴于所使用的HASH算法,安全性主要有以下幾點(diǎn)保證:
(1)使用的密鑰是雙方事先約定的,第三方不可能知道。由上面介紹應(yīng)用流程可以看出,作為非法截獲信息的第三方,能夠得到的信息只有作為“挑戰(zhàn)”的隨機(jī)數(shù)和作為“響應(yīng)”的HMAC結(jié)果,無(wú)法根據(jù)這兩個(gè)數(shù)據(jù)推算出密鑰。由于不知道密鑰,所以無(wú)法仿造出一致的響應(yīng)。
(2)在HMAC算法的應(yīng)用中,第三方不可能事先知道輸出(如果知道,不用構(gòu)造輸入,直接將輸出送給服務(wù)器即可)。
(3) HMAC算法與一般的加密重要的區(qū)別在于它具有“瞬時(shí)”性,即認(rèn)證只在當(dāng)時(shí)有效,而加密算法被破解后,以前的加密結(jié)果就可能被解密。
?
?
?
hmac 介紹
?編輯
HMAC是密鑰相關(guān)的哈希運(yùn)算消息認(rèn)證碼,HMAC運(yùn)算利用哈希算法,以一個(gè)密鑰和一個(gè)消息為輸入,生成一個(gè)消息摘要作為輸出。
?
中文名
哈希消息認(rèn)證碼
外文名
Hash-based Message Authentication Code
縮????寫
HMAC
概述?
HMAC是密鑰相關(guān)的哈希運(yùn)算
運(yùn)算作用
驗(yàn)證TPM接受的授權(quán)數(shù)
目錄
?
簡(jiǎn)介
編輯
運(yùn)算作用
(1)驗(yàn)證TPM接受的授權(quán)數(shù)據(jù)和認(rèn)證數(shù)據(jù);
(2)確認(rèn)TPM接受到的命令請(qǐng)求是已授權(quán)的請(qǐng)求,并且,命令在傳送的過(guò)程中沒(méi)有被改動(dòng)過(guò)。
定義HMAC需要一個(gè)加密用散列函數(shù)(表示為H,可以是MD5或者SHA-1)和一個(gè)密鑰K。我們用B來(lái)表示數(shù)據(jù)塊的字節(jié)數(shù)。(以上所提到的散列函數(shù)的分割數(shù)據(jù)塊字長(zhǎng)B=64),用L來(lái)表示散列函數(shù)的輸出數(shù)據(jù)字節(jié)數(shù)(MD5中L=16,SHA-1中L=20)。鑒別密鑰的長(zhǎng)度可以是小于等于數(shù)據(jù)塊字長(zhǎng)的任何正整數(shù)值。應(yīng)用程序中使用的密鑰長(zhǎng)度若是比B大,則首先用使用散列函數(shù)H作用于它,然后用H輸出的L長(zhǎng)度字符串作為在HMAC中實(shí)際使用的密鑰。一般情況下,推薦的最小密鑰K長(zhǎng)度是L個(gè)字節(jié)。
算法表示
算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))?[1]?
H 代表所采用的HASH算法(如SHA-256)
K 代表認(rèn)證密碼
Ko 代表HASH算法的密文
M 代表一個(gè)消息輸入
B 代表H中所處理的塊大小,這個(gè)大小是處理塊大小,而不是輸出hash的大小
如,SHA-1和SHA-256 B = 64
SHA-384和SHA-512 B = 128
L 表示hash的大小
Opad 用0x5c重復(fù)B次
Ipad 用0x36重復(fù)B次
Apad 用0x878FE1F3重復(fù)(L/4)次
HMAC運(yùn)算步驟
First-Hash = H(Ko XOR Ipad || (data to auth))
Second-Hash = H(Ko XOR Opad || First-Hash)
(1) 在密鑰K后面添加0來(lái)創(chuàng)建一個(gè)字長(zhǎng)為B的字符串。(例如,如果K的字長(zhǎng)是20字節(jié),B=64字節(jié),則K后會(huì)加入44個(gè)零字節(jié)0x00)
(2) 將上一步生成的B字長(zhǎng)的字符串與ipad做異或運(yùn)算。
(3) 將數(shù)據(jù)流text填充至第二步的結(jié)果字符串中。
(4) 用H作用于第三步生成的數(shù)據(jù)流。
(5) 將第一步生成的B字長(zhǎng)字符串與opad做異或運(yùn)算。
(6) 再將第四步的結(jié)果填充進(jìn)第五步的結(jié)果中。
(7) 用H作用于第六步生成的數(shù)據(jù)流,輸出最終結(jié)果
HMAC的應(yīng)用
hmac主要應(yīng)用在身份驗(yàn)證中,它的使用方法是這樣的:
(1) 客戶端發(fā)出登錄請(qǐng)求(假設(shè)是瀏覽器的GET請(qǐng)求)
(2) 服務(wù)器返回一個(gè)隨機(jī)值,并在會(huì)話中記錄這個(gè)隨機(jī)值
(3) 客戶端將該隨機(jī)值作為密鑰,用戶密碼進(jìn)行hmac運(yùn)算,然后提交給服務(wù)器
(4) 服務(wù)器讀取用戶數(shù)據(jù)庫(kù)中的用戶密碼和步驟2中發(fā)送的隨機(jī)值做與客戶端一樣的hmac運(yùn)算,然后與用戶發(fā)送的結(jié)果比較,如果結(jié)果一致則驗(yàn)證用戶合法
在這個(gè)過(guò)程中,可能遭到安全攻擊的是服務(wù)器發(fā)送的隨機(jī)值和用戶發(fā)送的hmac結(jié)果,而對(duì)于截獲了這兩個(gè)值的黑客而言這兩個(gè)值是沒(méi)有意義的,絕無(wú)獲取用戶密碼的可能性,隨機(jī)值的引入使hmac只在當(dāng)前會(huì)話中有效,大大增強(qiáng)了安全性和實(shí)用性。大多數(shù)的語(yǔ)言都實(shí)現(xiàn)了hmac算法,比如php的mhash、python的hmac.py、java的MessageDigest類,在web驗(yàn)證中使用hmac也是可行的,用js進(jìn)行md5運(yùn)算的速度也是比較快的。
典型應(yīng)用
編輯
HMAC的一個(gè)典型應(yīng)用是用在“質(zhì)疑/應(yīng)答”(Challenge/Response)身份認(rèn)證中。
認(rèn)證流程
(1) 先由客戶端向服務(wù)器發(fā)出一個(gè)驗(yàn)證請(qǐng)求。
(2) 服務(wù)器接到此請(qǐng)求后生成一個(gè)隨機(jī)數(shù)并通過(guò)網(wǎng)絡(luò)傳輸給客戶端(此為質(zhì)疑)。
(3) 客戶端將收到的隨機(jī)數(shù)提供給ePass,由ePass使用該隨機(jī)數(shù)與存儲(chǔ)在ePass中的密鑰進(jìn)行HMAC-MD5運(yùn)算并得到一個(gè)結(jié)果作為認(rèn)證證據(jù)傳給服務(wù)器(此為響應(yīng))。
(4) 與此同時(shí),服務(wù)器也使用該隨機(jī)數(shù)與存儲(chǔ)在服務(wù)器數(shù)據(jù)庫(kù)中的該客戶密鑰進(jìn)行HMAC-MD5運(yùn)算,如果服務(wù)器的運(yùn)算結(jié)果與客戶端傳回的響應(yīng)結(jié)果相同,則認(rèn)為客戶端是一個(gè)合法用戶
安全性淺析
由上面的介紹,我們可以看出,HMAC算法更象是一種加密算法,它引入了密鑰,其安全性已經(jīng)不完全依賴于所使用的HASH算法,安全性主要有以下幾點(diǎn)保證:
(1) 使用的密鑰是雙方事先約定的,第三方不可能知道。由3.2介紹的應(yīng)用流程可以看出,作為非法截獲信息的第三方,能夠得到的信息只有作為“挑戰(zhàn)”的隨機(jī)數(shù)和作為“響應(yīng)”的HMAC結(jié)果,無(wú)法根據(jù)這兩個(gè)數(shù)據(jù)推算出密鑰。由于不知道密鑰,所以無(wú)法仿造出一致的響應(yīng)。
總結(jié)
以上是生活随笔為你收集整理的【转】HMAC哈希消息认证码及算法原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2020年LPR利率是多少?最新LPR利
- 下一篇: 信用卡逾期记录可以删除吗?信用卡逾期相关