您好,登錄后才能下訂單哦!
hmac模塊
hmac模塊用于生成HMAC碼。這個(gè)HMAC碼可以用于驗(yàn)證消息的完整性,其原理也很簡(jiǎn)單,就是一種加入了密鑰的消息摘要,相比起MAC更加安全。JWT(JSON Web Token)中第三部分的消息摘要就是使用了HMAC。
HMAC(Hash-based Message Authentication Code)
先大致介紹一下HMAC吧。HMAC是一種消息摘要算法,是一種特殊的MAC(消息認(rèn)證碼),內(nèi)部使用別的摘要算法進(jìn)行摘要的計(jì)算(比如MD5)。相比MAC,HMAC在生成摘要的時(shí)候加入了密鑰,這使得HMAC碼不僅可以用于驗(yàn)證消息完整性,并且保證了其無(wú)法被偽造。注意,摘要算法跟加密算法是有區(qū)別的。
整個(gè)算法可以總結(jié)為下圖 圖片來(lái)自wiki:
K:key,密鑰
K':調(diào)整長(zhǎng)度之后的密鑰
m:message,消息
H:hash function,消息摘要算法
opad:outer padding,一個(gè)塊長(zhǎng)度的十六進(jìn)制常數(shù),Ox5c5c5c…5c
ipad:inner padding,一個(gè)塊長(zhǎng)度的十六進(jìn)制常數(shù),Ox363636…36
計(jì)算步驟:
如果K的長(zhǎng)度大于使用的摘要算法的Block Size(比如MD5中是64),HMAC算法會(huì)先計(jì)算K的摘要,而當(dāng)K的長(zhǎng)度小于Block Size時(shí)則用0進(jìn)行填充。這一步得到結(jié)果K'。
將K'與ipad做異或運(yùn)算。
上一步的結(jié)果加上m并計(jì)算消息摘要值。
將K'與opad做異或運(yùn)算。
上一步的結(jié)果加上第三步的結(jié)果并計(jì)算消息摘要值,這一步的結(jié)果為最終結(jié)果。
hmac.HMAC(key, msg=None, digestmod=None)
hmac模塊中最核心的就是HMAC類(lèi),可以直接通過(guò)實(shí)例化來(lái)獲取該類(lèi)的實(shí)例,也可以通過(guò)調(diào)用函數(shù)hmac.new(key, msg=None, digestmod=None)獲取。
參數(shù)key可以是一個(gè)bytes對(duì)象或者bytearray對(duì)象,是用于加密的密鑰。如果key大于Block Size(默認(rèn)是64),會(huì)先計(jì)算一次消息摘要,小于的話用0填充到與Block Size相同的長(zhǎng)度。
參數(shù)msg是用于加密的消息。
參數(shù)digestmod是用于計(jì)算摘要的算法,默認(rèn)使用hashlib.md5。這個(gè)參數(shù)支持三種類(lèi)型的值:
可以是hashlib里面的其他的構(gòu)造器,比如hashlib.sha1、hashlib.sha256等
可以是一個(gè)字符串,會(huì)調(diào)用hashlib.new(digestmod)獲取相應(yīng)的構(gòu)造器
可以是一個(gè)符合PEP247標(biāo)準(zhǔn)的模塊,這時(shí)會(huì)調(diào)用digestmod.new()
API
HMAC.update(msg)
更新HMAC對(duì)象的內(nèi)容,附加到之前的msg后面。
HMAC.digest()
返回消息摘要值。因?yàn)镠MAC.update()會(huì)動(dòng)態(tài)修改msg內(nèi)容,所以每次都會(huì)重新計(jì)算。
HMAC.hexdigest()
以十六進(jìn)制的形式返回消息摘要值。因?yàn)镠MAC.update()會(huì)動(dòng)態(tài)修改msg內(nèi)容,所以每次都會(huì)重新計(jì)算。
HMAC.copy()
返回HMAC對(duì)象的克隆,用于在兩個(gè)對(duì)象內(nèi)容擁有相同部分的時(shí)候提高效率,修改克隆的對(duì)象不會(huì)影響原對(duì)象。
有一個(gè)地方很有意思,這個(gè)函數(shù)在內(nèi)部是調(diào)用self.__class__.__new__(self.__class__),再把關(guān)鍵參數(shù)賦值給新對(duì)象,這樣做會(huì)比直接調(diào)用__init__的效率高一些。
屬性
HMAC.digest_size
摘要值的長(zhǎng)度。
HMAC.block_size
如果根據(jù)參數(shù)digestmod獲取的構(gòu)造器沒(méi)有Block Size或者小于16,會(huì)使用默認(rèn)值64。
HMAC.name
HMAC的名字,值為hmac-{內(nèi)部摘要算法名字},比如hamc-md5。
hmac.compare_digest(a, b)
在hmac模塊中,通過(guò)from _operator import _compare_digest as compare_digest引入了這個(gè)函數(shù)。這個(gè)函數(shù)簡(jiǎn)單點(diǎn)來(lái)說(shuō)就是用來(lái)比較a與b值是否相等的,當(dāng)將外部輸入的值與HMAC.degest()/HMAC.hexdigest()的輸出做比較時(shí),有可能會(huì)遭到時(shí)序攻擊,所以可以通過(guò)調(diào)用這個(gè)函數(shù)比較值并防御可能存在的攻擊行為。Python3.3版本后新增。
至于什么是“時(shí)序攻擊”,大家可以自行上wiki查閱,或者查看知乎上的問(wèn)答如何通俗地解釋時(shí)序攻擊。
總結(jié)
以上就是本文關(guān)于hmac模塊生成加入了密鑰的消息摘要詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。