Python之hmac模块的使用
hmac模块的作用:
用于验证信息的完整性。
1、hmac消息签名(默认使用MD5加算法)
#!/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)
hmac_md5.py
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.
content.txt
运行效果
[root@ mnt]# python3 hmac_md5.py
79cbf5942e8f67be558bc28610c02117
2、hmac消息签名摘要(使用SHA1加算法)
#!/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)
hmac_sha1.py
运行效果
[root@ mnt]# python3 hmac_sha1.py
e5c012eac5fa76a274f77ee678e6cc98cad8fff9
3、hmac二进制消息签名摘要(使用SHA1加算法)
#!/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
hmac_base64.py
运行效果
[root@ mnt]# python3 hmac_base64.py
b'Y9a4OMRqU4DB6Ks/hGfru+MNXAw=\n'
4、hmac摘要数据比较示例
#!/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('数据不完整')
hmac_pickle.py
运行效果
[root@ mnt]# python3 hmac_pickle.py
提示:b'00e080735a8de379e19fe2aa731c92fc9253a6e2 69\n'
提示:b'1d147690f94ea374f6f8c3767bd5a5f9a8989a53 78\n'
读取到: b'00e080735a8de379e19fe2aa731c92fc9253a6e2'
实际值: b'00e080735a8de379e19fe2aa731c92fc9253a6e2'
OK: digest matches
读取到: b'1d147690f94ea374f6f8c3767bd5a5f9a8989a53'
实际值: b'4dcaad9b05bbb67b571a64defa52e8960a27c45d'
数据不完整
Python之hmac模块的使用的更多相关文章
- Python hashlib&hmac 模块
用于加密相关的操作,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 hashlib模块示例: import hashlib m = hashlib. ...
- python中hmac模块的使用
hmac(hex-based message authentication code)算法在计算哈希的过程中混入了key(实际上就是加盐),和hashlib模块中的普通加密算法相比,它能够防止密码被撞 ...
- Python之数据加密与解密及相关操作(hashlib模块、hmac模块、random模块、base64模块、pycrypto模块)
本文内容 数据加密概述 Python中实现数据加密的模块简介 hashlib与hmac模块介绍 random与secrets模块介绍 base64模块介绍 pycrypto模块介绍 总结 参考文档 提 ...
- Python自带的hmac模块
Python自带的hmac模块实现了标准的Hmac算法 我们首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下: import hmac mess ...
- Python标准库之hashlib模块与hmac模块
hashlib模块用于加密相关的操作.在Python 3.x里代替了md5模块和sha模块,主要提供 SHA1.SHA224.SHA256.SHA384.SHA512 .MD5 算法.如果包含中文字符 ...
- python hashlib、hmac模块
一.hashlib模块 import hashlib m = hashlib.md5() m.update(b"Hello") print(m.hexdigest()) m.upd ...
- python 加密 hashlib与hmac模块
https://www.jb51.net/article/128911.htm hashlib模块简介: hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 ...
- 学习PYTHON之路, DAY 6 - PYTHON 基础 6 (模块)
一 安装,导入模块 安装: pip3 install 模块名称 导入: import module from module.xx.xx import xx from module.xx.xx impo ...
- python基础之模块
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合. 而对于一个复杂的功能来,可能需要多个函数 ...
随机推荐
- 使用Minikube运行一个本地单节点Kubernetes集群(阿里云)
使用Minikube运行一个本地单节点Kubernetes集群中使用谷歌官方镜像由于某些原因导致镜像拉取失败以及很多人并没有代理无法开展相关实验. 因此本文使用阿里云提供的修改版Minikube创建一 ...
- GTID复制
什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能.GTID是事务提交时创建分配 ...
- element-ui table float类型数据排序失败
背景:对于16.88这样的数据,点击表头排序无效,仍然是乱序 解决办法:自定义排序方法,:sortable="true" :sort-mothod="xxxx" ...
- Asp.Net Core 中间件
什么是中间件(Middleware)? 中间件是组装到应用程序管道中以处理请求和响应的软件. 每个组件: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的下一个组件之前和之后执行工作. 请 ...
- vue进阶:vuex(数据池)
非父子组件传值 vuex 一.非父子组件传值 基于父子组件通信与传值实现非父子组件传值的示例关键代码: <template> <div> <!-- 学员展示 --> ...
- img 图像底部留白的原因以及解决方法
有时候,我们在添加图片img标签后并没有给该标签设置magrin属性的margin-bottom值,在有些浏览器中打开就会出现图像底部留白,为什么为造成这个原因?下面就来进行分析:由于img元素默认为 ...
- HttpClient的GET请求(post)请求
一.不带参数的GET请求 // 创建Httpclient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建ht ...
- python 文本相似度计算
参考:python文本相似度计算 原始语料格式:一个文件,一篇文章. #!/usr/bin/env python # -*- coding: UTF-8 -*- import jieba from g ...
- linux下共享热点抓包
Linux有一个抓包工具叫tcpdump,这个命令还是挺强大的.简单列举一下它的参数 # tcpdump -h tcpdump version 4.9.2 libpcap version 1.8.1 ...
- 解决:Nginx访问静态页面出现中文乱码
需要修改nginx的server的配置内容,增加一行:charset utf-8; 详情如下: upstream you.domainName.com { server 127.0.0.1:8080; ...