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中的多进程与多线程的使用
Apr 07 Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
tensorflow实现简单的卷积神经网络
May 24 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
Django中celery执行任务结果的保存方法
Jul 12 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
Jul 22 Python
python机器学习实现决策树
Nov 11 Python
Visual Studio code 配置Python开发环境
Sep 11 Python
PyTorch device与cuda.device用法
Apr 03 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
8个PHP数组面试题
2015/06/23 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
Python魔术方法详解
2015/02/14 Python
Python 处理数据的实例详解
2017/08/10 Python
Python探索之ModelForm代码详解
2017/10/26 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
Python 实现一个计时器
2020/07/28 Python
若干个Java基础面试题
2015/05/19 面试题
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2014年客服工作总结与计划
2014/12/09 职场文书
儿子满月酒致辞
2015/07/29 职场文书
商务信函英语问候语
2015/11/10 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
python之django路由和视图案例教程
2021/07/26 Python