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 executemany的使用及注意事项
Mar 13 Python
django使用图片延时加载引起后台404错误
Apr 18 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
django解决跨域请求的问题
Nov 11 Python
python英语单词测试小程序代码实例
Sep 09 Python
Python单链表原理与实现方法详解
Feb 22 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
基于python实现检索标记敏感词并输出
May 07 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
Python 制作自动化翻译工具
Apr 25 Python
Python中三种花式打印的示例详解
Mar 19 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
JavaScript 函数调用规则
2009/09/14 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
javascript时间差插件分享
2016/07/18 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
2020/09/21 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
基于python的汉字转GBK码实现代码
2012/02/19 Python
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python如何保证输入键入数字的方法
2019/08/23 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
Python 实现try重新执行
2019/12/21 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
中学实习教师自我鉴定
2013/12/12 职场文书
书法培训心得体会
2014/01/05 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
职业生涯规划书范文
2014/03/10 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
超级礼物观后感
2015/06/15 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL