hmac模块生成加入了密钥的消息摘要详解

 更新时间:2018年01月11日 10:21:34   作者:GanZiQim  
这篇文章主要介绍了hmac模块生成加入了密钥的消息摘要详解,具有一定借鉴价值,需要的朋友可以参考下

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模块生成加入了密钥的消息摘要详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Django使用paginator插件实现翻页功能的实例

    Django使用paginator插件实现翻页功能的实例

    今天小编就为大家分享一篇关于Django使用paginator插件实现翻页功能的实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • python实现的一只从百度开始不断搜索的小爬虫

    python实现的一只从百度开始不断搜索的小爬虫

    这是我第三天学python了, 想写一个东西纪念一下吧,于是写了一直爬虫,但是不是好的虫,只能讲网页的关键词存到本地, 但是我觉得基本上算是一只小虫了
    2013-08-08
  • Python通过正则库爬取淘宝商品信息代码实例

    Python通过正则库爬取淘宝商品信息代码实例

    这篇文章主要介绍了Python通过正则库爬取淘宝商品信息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 简单理解Python中基于生成器的状态机

    简单理解Python中基于生成器的状态机

    这篇文章主要介绍了简单理解Python中基于生成器的状态机,来自于IBM官方技术文档,需要的朋友可以参考下
    2015-04-04
  • Python进行指数和对数曲线拟合详解

    Python进行指数和对数曲线拟合详解

    曲线拟合是构造曲线或数学函数的过程,其具有对一系列数据点的最佳拟合,可能受到约束,本文主要介绍了如何使用Python实现指数和对数曲线拟合,需要的可以参考下
    2024-04-04
  • Python Fire实现自动生成命令行接口

    Python Fire实现自动生成命令行接口

    命令行程序是平时写一些小工具时最常用的方式,随着命令行程序功能的丰富,也就是参数多了以后,解析和管理参数之间的关系会变得越来越繁重,而本次介绍的 Fire 库正好可以解决这个问题,下面我们就来看看具体实现方法吧
    2023-09-09
  • Django model重写save方法及update踩坑详解

    Django model重写save方法及update踩坑详解

    这篇文章主要介绍了Django model重写save方法及update踩坑详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python OpenCV图像的位运算操作

    Python OpenCV图像的位运算操作

    位运算是计算机科学中一种基础而高效的操作,它直接对二进制位进行处理,在图像处理中,位运算也是一种重要的技术,尤其在图像的合成、分离、掩模处理等场景中,常常用到位运算,本文将介绍图像处理中的常见位运算操作,需要的朋友可以参考下
    2024-12-12
  • Python实现竖排打印传单手机号码易撕条

    Python实现竖排打印传单手机号码易撕条

    这篇文章主要介绍了Python实现竖排打印传单手机号码易撕条,代码非常简单,功能很实用,推荐给大家,有需要的小伙伴,参考下
    2015-03-03
  • python深度学习之多标签分类器及pytorch实现源码

    python深度学习之多标签分类器及pytorch实现源码

    这篇文章主要为大家介绍了python深度学习之多标签分类器的使用说明及pytorch的实现源码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-01-01

最新评论