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

作者:GanZiQim 时间:2023-05-17 09:26:46 

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查阅,或者查看知乎上的问答如何通俗地解释时序攻击。

来源:http://blog.csdn.net/jy692405180/article/details/78636767

标签:python,hmac,模块,秘钥
0
投稿

猜你喜欢

  • python用Configobj模块读取配置文件

    2023-10-30 04:29:00
  • javascript同页面多次调用弹出层具体实例代码

    2024-04-10 14:02:31
  • python XlsxWriter模块创建aexcel表格的实例讲解

    2023-08-30 02:20:47
  • 解决jupyter notebook启动后没有token的坑

    2023-03-18 23:46:37
  • PyTorch中torch.matmul()函数常见用法总结

    2023-03-28 16:01:31
  • WEB开发中合理选择图片格式

    2011-09-22 20:32:06
  • Python制作exe文件简单流程

    2022-06-07 01:11:12
  • MySQL中Innodb的事务隔离级别和锁的关系的讲解教程

    2024-01-13 18:20:21
  • asp查询xml的代码 不刷新页面查询的方法

    2011-04-06 11:00:00
  • python中pivot()函数基础知识点

    2023-12-18 15:28:06
  • P3P 和 跨域 (cross-domain) cookie 访问(读取和设置)

    2011-04-02 10:42:00
  • Python实现霍夫圆和椭圆变换代码详解

    2022-12-22 19:32:29
  • Python Flask框架模板操作实例分析

    2022-09-21 02:56:23
  • 数字人整合动网论坛的方法

    2009-05-29 18:23:00
  • python爬虫获取京东手机图片的图文教程

    2023-12-24 08:29:21
  • 使用pandas库对csv文件进行筛选保存

    2022-12-25 04:55:10
  • python实现马丁策略回测3000只股票的实例代码

    2023-03-02 01:12:29
  • python实现简单文件读写函数

    2023-08-29 04:37:24
  • Python3 XML 获取雅虎天气的实现方法

    2023-02-13 16:35:38
  • MySQL性能优化之路---修改配置文件my.cnf

    2024-01-23 16:20:53
  • asp之家 网络编程 m.aspxhome.com