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


Posted in Python onJanuary 11, 2018

hmac模块

hmac模块用于生成HMAC码。这个HMAC码可以用于验证消息的完整性,其原理也很简单,就是一种加入了密钥的消息摘要,相比起MAC更加安全。JWT(JSON Web Token)中第三部分的消息摘要就是使用了HMAC。

HMAC(Hash-based Message Authentication Code)

先大致介绍一下HMAC吧。HMAC是一种消息摘要算法,是一种特殊的MAC(消息认证码),内部使用别的摘要算法进行摘要的计算(比如MD5)。相比MAC,HMAC在生成摘要的时候加入了密钥,这使得HMAC码不仅可以用于验证消息完整性,并且保证了其无法被伪造。注意,摘要算法跟加密算法是有区别的。

整个算法可以总结为下图 图片来自wiki:

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

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

Python 相关文章推荐
python 实现文件的递归拷贝实现代码
Aug 02 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 Python
Python数据正态性检验实现过程
Apr 18 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 Python
Python 中的 copy()和deepcopy()
Nov 07 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 Python
快速了解Python中的装饰器
Jan 11 #Python
简单了解python模块概念
Jan 11 #Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 #Python
python实现外卖信息管理系统
Jan 11 #Python
Python实现学生成绩管理系统
Apr 05 #Python
名片管理系统python版
Jan 11 #Python
Python学生成绩管理系统简洁版
Apr 05 #Python
You might like
oracle资料库函式库
2006/10/09 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
更正确的asp冒泡排序
2007/05/24 Javascript
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
关于二级域名下使用一级域名下的COOKIE的问题
2011/11/07 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
django输出html内容的实例
2018/05/27 Python
Python实现多属性排序的方法
2018/12/05 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
2014年党务公开方案
2014/05/08 职场文书
物资采购方案
2014/06/12 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
寒假生活随笔
2015/08/15 职场文书
python状态机transitions库详解
2021/06/02 Python
python常见的占位符总结及用法
2021/07/02 Python
JavaScript实现简单的音乐播放器
2022/08/14 Javascript