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 相关文章推荐
用Pygal绘制直方图代码示例
Dec 07 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
Python Flask基础教程示例代码
Feb 07 Python
Python提取频域特征知识点浅析
Mar 04 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
PyCharm 专业版安装图文教程
Feb 20 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
python爬虫使用scrapy注意事项
Nov 23 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 Python
SpringBoot首页设置解析(推荐)
Feb 11 Python
Python 制作自动化翻译工具
Apr 25 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
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
PHP微商城开源代码实例
2019/03/27 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
javascript获取当前ip的代码
2009/05/10 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
python之yield表达式学习
2014/09/02 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
物流专业大学的自我评价
2014/01/11 职场文书
小班开学寄语
2014/04/04 职场文书
工商企业管理应届生求职信
2014/05/04 职场文书
骨干教师申报材料
2014/12/17 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
诚信教育主题班会
2015/08/13 职场文书
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技