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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
详解python3中zipfile模块用法
Jun 18 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
Pycharm+Python+PyQt5使用详解
Sep 25 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
利用Pytorch实现简单的线性回归算法
Jan 15 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python页面加载的等待方式总结
Feb 28 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获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
python正则表达式抓取成语网站
2013/11/20 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
python压包的概念及实例详解
2021/02/17 Python
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
计算机专业自我鉴定
2013/10/15 职场文书
医学专业五年以上个人求职信
2013/12/03 职场文书
微电影大赛策划方案
2014/06/05 职场文书
篮球社团活动总结
2014/06/27 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
优秀教师单行材料
2014/12/16 职场文书
自我评价优缺点范文
2015/03/11 职场文书
详解Go与PHP的语法对比
2021/05/29 PHP