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中声明只包含一个元素的元组数据方法
Aug 25 Python
Python输出9*9乘法表的方法
May 25 Python
Python多线程结合队列下载百度音乐的方法
Jul 27 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python指定写入文件时的编码格式方法
Jun 07 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
python3.6数独问题的解决
Jan 21 Python
python flask搭建web应用教程
Nov 19 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
Python configparser模块应用过程解析
Aug 14 Python
python绘图模块之利用turtle画图
Feb 12 Python
python中取整数的几种方法
Nov 07 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的FTP学习(一)
2006/10/09 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
微信access_token的获取开发示例
2015/04/16 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
Add a Table to a Word Document
2007/06/15 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
python中的装饰器详解
2015/04/13 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
Python迭代和迭代器详解
2016/11/10 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
python人民币小写转大写辅助工具
2018/06/20 Python
Python实现微信小程序支付功能
2019/07/25 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
shell程序中如何注释
2012/02/17 面试题
软件测试面试题
2014/01/05 面试题
资产经营总监岗位职责范文
2013/12/01 职场文书
高中毕业自我鉴定
2013/12/13 职场文书
往来会计岗位职责
2013/12/19 职场文书
学生操行评语大全
2014/04/24 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
2015年政教主任工作总结
2015/07/23 职场文书