hmac模块
hmac模块用于生成HMAC码。这个HMAC码可以用于验证消息的完整性,其原理也很简单,就是一种加入了密钥的消息摘要,相比起MAC更加安全。JWT(JSON Web Token)中第三部分的消息摘要就是使用了HMAC。
HMAC(Hash-based Message Authentication Code)
先大致介绍一下HMAC吧。HMAC是一种消息摘要算法,是一种特殊的MAC(消息认证码),内部使用别的摘要算法进行摘要的计算(比如MD5)。相比MAC,HMAC在生成摘要的时候加入了密钥,这使得HMAC码不仅可以用于验证消息完整性,并且保证了其无法被伪造。注意,摘要算法跟加密算法是有区别的。
整个算法可以总结为下图 图片来自wiki:
K:key,密钥
K':调整长度之后的密钥
m:message,消息
H:hash function,消息摘要算法
opad:outer padding,一个块长度的十六进制常数,Ox5c5c5c…5c
ipad:inner padding,一个块长度的十六进制常数,Ox363636…36
计算步骤:
如果K的长度大于使用的摘要算法的Block Size(比如MD5中是64),HMAC算法会先计算K的摘要,而当K的长度小于Block Size时则用0进行填充。这一步得到结果K'。
将K'与ipad做异或运算。
上一步的结果加上m并计算消息摘要值。
将K'与opad做异或运算。
上一步的结果加上第三步的结果并计算消息摘要值,这一步的结果为最终结果。
hmac.HMAC(key, msg=None, digestmod=None)
hmac模块中最核心的就是HMAC类,可以直接通过实例化来获取该类的实例,也可以通过调用函数hmac.new(key, msg=None, digestmod=None)获取。
参数key可以是一个bytes对象或者bytearray对象,是用于加密的密钥。如果key大于Block Size(默认是64),会先计算一次消息摘要,小于的话用0填充到与Block Size相同的长度。
参数msg是用于加密的消息。
参数digestmod是用于计算摘要的算法,默认使用hashlib.md5。这个参数支持三种类型的值:
可以是hashlib里面的其他的构造器,比如hashlib.sha1、hashlib.sha256等
可以是一个字符串,会调用hashlib.new(digestmod)获取相应的构造器
可以是一个符合PEP247标准的模块,这时会调用digestmod.new()
API
HMAC.update(msg)
更新HMAC对象的内容,附加到之前的msg后面。
HMAC.digest()
返回消息摘要值。因为HMAC.update()会动态修改msg内容,所以每次都会重新计算。
HMAC.hexdigest()
以十六进制的形式返回消息摘要值。因为HMAC.update()会动态修改msg内容,所以每次都会重新计算。
HMAC.copy()
返回HMAC对象的克隆,用于在两个对象内容拥有相同部分的时候提高效率,修改克隆的对象不会影响原对象。
有一个地方很有意思,这个函数在内部是调用self.__class__.__new__(self.__class__),再把关键参数赋值给新对象,这样做会比直接调用__init__的效率高一些。
属性
HMAC.digest_size
摘要值的长度。
HMAC.block_size
如果根据参数digestmod获取的构造器没有Block Size或者小于16,会使用默认值64。
HMAC.name
HMAC的名字,值为hmac-{内部摘要算法名字},比如hamc-md5。
hmac.compare_digest(a, b)
在hmac模块中,通过from _operator import _compare_digest as compare_digest引入了这个函数。这个函数简单点来说就是用来比较a与b值是否相等的,当将外部输入的值与HMAC.degest()/HMAC.hexdigest()的输出做比较时,有可能会遭到时序攻击,所以可以通过调用这个函数比较值并防御可能存在的攻击行为。Python3.3版本后新增。
至于什么是“时序攻击”,大家可以自行上wiki查阅,或者查看知乎上的问答如何通俗地解释时序攻击。
总结
以上就是本文关于hmac模块生成加入了密钥的消息摘要详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。