Python hmac模块使用实例解析


Posted in Python onDecember 24, 2019

这篇文章主要介绍了Python hmac模块使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

hmac模块的作用:

用于验证信息的完整性。

1、hmac消息签名(默认使用MD5加算法)

hmac_md5.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import hmac
#默认使用是md5算法
digest_maker = hmac.new('secret-shared-key'.encode('utf-8'))
with open('content.txt', 'rb') as f:
  while True:
    block = f.read(1024)
    if not block:
      break
    digest_maker.update(block)
digest = digest_maker.hexdigest()
print(digest)

content.txt

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec
egestas, enim et consectetuer ullamcorper, lectus ligula rutrum leo, a
elementum elit tortor eu quam. Duis tincidunt nisi ut ante. Nulla
facilisi. Sed tristique eros eu libero. Pellentesque vel arcu. Vivamus
purus orci, iaculis ac, suscipit sit amet, pulvinar eu,
lacus. Praesent placerat tortor sed nisl. Nunc blandit diam egestas
dui. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Aliquam viverra fringilla
leo. Nulla feugiat augue eleifend nulla. Vivamus mauris. Vivamus sed
mauris in nibh placerat egestas. Suspendisse potenti. Mauris massa. Ut
eget velit auctor tortor blandit sollicitudin. Suspendisse imperdiet
justo.

运行效果

[root@ mnt]# python3 hmac_md5.py 
79cbf5942e8f67be558bc28610c02117

2、hmac消息签名摘要(使用SHA1加算法)

hmac_sha1.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import hmac

digest_maker = hmac.new('secret-shared-key'.encode('utf-8'), b'', digestmod='sha1')
# hmac.new(key,msg,digestmod)
# key:加盐的key,
# msg:加密的内容,
# digestmod:加密的方式

with open('hmac_sha1.py', 'rb') as f:
  while True:
    block = f.read(1024)
    if not block:
      break
    digest_maker.update(block)
digest = digest_maker.hexdigest()
print(digest)

运行效果

[root@ mnt]# python3 hmac_sha1.py 
e5c012eac5fa76a274f77ee678e6cc98cad8fff9

3、hmac二进制消息签名摘要(使用SHA1加算法)

hmac_base64.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import hmac
import base64
import hashlib

with open('test.py', 'rb') as f:
  body = f.read()

# 默认使用是md5算法
digest_maker = hmac.new('secret-shared-key'.encode('utf-8'), body, hashlib.sha1)
# hmac.new(key,msg,digestmod)
# key:加盐的key,
# msg:加密的内容,
# digestmod:加密的方式

digest = digest_maker.digest() # 默认内容是字节类型,所以需要base64
print(base64.encodebytes(digest)) #注意base64结果是以\n结束,所以Http头部或其它传输时,需要去除\n

运行效果

[root@ mnt]# python3 hmac_base64.py 
b'Y9a4OMRqU4DB6Ks/hGfru+MNXAw=\n'

4、hmac摘要数据比较示例

hmac_pickle.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import hashlib
import hmac
import io
import pickle

def make_digest(message):
  "返消息摘要,加密码后的结果"
  hash = hmac.new(
    'secret-shared-key'.encode('utf-8'),
    message,
    hashlib.sha1
  )
  return hash.hexdigest().encode('utf-8')

class SimpleObject(object):
  def __init__(self, name):
    self.name = name

  def __str__(self):
    return self.name

# 输出缓冲区
out_s = io.BytesIO()
o = SimpleObject('digest matches')
pickle_data = pickle.dumps(o) # 序列化
digest = make_digest(pickle_data) # 使用sha1加密算法
header = b'%s  %d\n' % (digest, len(pickle_data))
print('提示:{}'.format(header))
out_s.write(header) # 将消息头写入缓冲区
out_s.write(pickle_data) # 将序列化内容写入缓冲区

o = SimpleObject('digest does not matches')
pickle_data = pickle.dumps(o)
digest = make_digest(b'not the pickled data at all')
header = b'%s  %d\n' % (digest, len(pickle_data))
print('提示:{}'.format(header))
out_s.write(header) # 将消息头写入缓冲区
out_s.write(pickle_data) # 将序列化内容写入缓冲区
out_s.flush() # 刷新缓冲区

# 输入缓冲区
in_s = io.BytesIO(out_s.getvalue())

while True:
  first_line = in_s.readline()
  if not first_line:
    break
  incoming_digest, incoming_length = first_line.split(b'  ')
  incoming_length = int(incoming_length.decode('utf-8'))
  print('读取到:', incoming_digest, incoming_length)

  incoming_pickled_data = in_s.read(incoming_length)

  actual_digest = make_digest(incoming_pickled_data) # 实际的摘要
  print('实际值:', actual_digest)

  if hmac.compare_digest(actual_digest, incoming_digest): # 比较两个摘要是否相等
    obj = pickle.loads(incoming_pickled_data)
    print('OK:', obj)
  else:
    print('数据不完整')

运行效果

[root@ mnt]# python3 hmac_pickle.py 
提示:b'00e080735a8de379e19fe2aa731c92fc9253a6e2  69\n'
提示:b'1d147690f94ea374f6f8c3767bd5a5f9a8989a53  78\n'
读取到: b'00e080735a8de379e19fe2aa731c92fc9253a6e2' 69
实际值: b'00e080735a8de379e19fe2aa731c92fc9253a6e2'
OK: digest matches
读取到: b'1d147690f94ea374f6f8c3767bd5a5f9a8989a53' 78
实际值: b'4dcaad9b05bbb67b571a64defa52e8960a27c45d'
数据不完整

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python对Access读写操作
Mar 30 Python
Python动态导入模块的方法实例分析
Jun 28 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
python 普通克里金(Kriging)法的实现
Dec 19 Python
python读写文件write和flush的实现方式
Feb 21 Python
Python利用for循环打印星号三角形的案例
Apr 12 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
Python Charles抓包配置实现流程图解
Sep 29 Python
python+openCV对视频进行截取的实现
Nov 27 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
Python中的xlrd模块使用整理
Jun 15 Python
Python hashlib模块实例使用详解
Dec 24 #Python
Python实现使用dir获取类的方法列表
Dec 24 #Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 #Python
Python中filter与lambda的结合使用详解
Dec 24 #Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 #Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 #Python
python保存log日志,实现用log日志画图
Dec 24 #Python
You might like
编写自己的php扩展函数
2006/10/09 PHP
php读取javascript设置的cookies的代码
2010/04/12 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
PHP爆绝对路径方法收集整理
2012/09/17 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
岗位职责范本
2013/11/23 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
公务员政审材料范文
2014/12/23 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
社区党建工作总结2015
2015/05/13 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
《检阅》教学反思
2016/02/22 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python