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编写的最短路径算法
Mar 25 Python
使用python实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
让python在hadoop上跑起来
Jan 27 Python
Python 探针的实现原理
Apr 23 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
python3 flask实现文件上传功能
Mar 20 Python
关于tf.reverse_sequence()简述
Jan 20 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
PyCharm2019 安装和配置教程详解附激活码
Jul 31 Python
python开发入门——set的使用
Sep 03 Python
python 检测图片是否有马赛克
Dec 01 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
4.与数据库的连接
2006/10/09 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
javascript操作符"!~"详解
2015/02/10 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
python基础教程之基本内置数据类型介绍
2014/02/20 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
满月酒答谢词
2014/01/14 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
2015年仓库工作总结
2015/04/09 职场文书
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫