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 相关文章推荐
可用于监控 mysql Master Slave 状态的python代码
Feb 10 Python
python optparse模块使用实例
Apr 09 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
对Python的Django框架中的项目进行单元测试的方法
Apr 11 Python
Python实现的递归神经网络简单示例
Aug 11 Python
python构建指数平滑预测模型示例
Nov 21 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
Python 抓取数据存储到Redis中的操作
Jul 16 Python
python requests库的使用
Jan 06 Python
Python打包exe时各种异常处理方案总结
May 18 Python
详解Python中下划线的5种含义
Jul 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中过滤非法字符的具体实现
2013/10/29 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
nodejs实现大文件(在线视频)的读取
2020/10/16 NodeJs
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
Vue中 key keep-alive的实现原理
2018/09/18 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
python mysqldb连接数据库
2009/03/16 Python
Python爬取读者并制作成PDF
2015/03/10 Python
Python实现线程状态监测简单示例
2018/03/28 Python
python爬取网易云音乐评论
2018/11/16 Python
导致python中import错误的原因是什么
2020/07/01 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
python中pyqtgraph知识点总结
2021/01/26 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
《晏子使楚》教学反思
2014/02/08 职场文书
期末评语大全
2014/05/04 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
庆祝儿童节标语
2014/10/09 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
我的中国梦主题班会
2015/08/14 职场文书
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS