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实现批量转换文件编码(批转换编码示例)
Jan 23 Python
Python开发常用的一些开源Package分享
Feb 14 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
python如何重载模块实例解析
Jan 25 Python
Python清空文件并替换内容的实例
Oct 22 Python
Python基础教程之异常详解
Jan 10 Python
Python中list的交、并、差集获取方法示例
Aug 01 Python
python保留小数位的三种实现方法
Jan 07 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 Python
几款好用的python工具库(小结)
Oct 20 Python
python selenium 获取接口数据的实现
Dec 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
使用数据库保存session的方法
2006/10/09 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python素数检测的方法
2015/05/11 Python
python字符串的方法与操作大全
2018/01/30 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
电大自我鉴定范文
2013/10/01 职场文书
公务员年总结的自我评价
2013/10/25 职场文书
审计工作个人的自我评价
2013/12/25 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
工人先锋号申报材料
2014/12/29 职场文书
周年庆典答谢词
2015/01/20 职场文书
高中军训感想
2015/08/07 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏