前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Day19内建模块struct&hashlib&hmac

Day19内建模块struct&hashlib&hmac

作者头像
林清猫耳
发布2018-04-26 15:36:35
7810
发布2018-04-26 15:36:35
举报
文章被收录于专栏:我爱编程我爱编程

struct

Python提供了一个struct模块来解决bytes和其他二进制数据类型的转换。 structpack函数把任意数据类型变成bytes

代码语言:javascript
复制
>>> bs = bytes([b1,b2,b3,b4])
>>> bs
b'\x00\x9c@c'

pack的第一个参数是处理指令,'>I'的意思是: >表示字节顺序是big-endian,也就是网络序,I表示4字节无符号整数。 后面的参数个数要和处理指令一致。 unpackbytes变成相应的数据类型:

代码语言:javascript
复制
>>> struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')
(4042322160, 32896)

根据>IH的说明,后面的bytes依次变为I:4字节无符号整数和H:2字节无符号整数。 所以,尽管Python不适合编写底层操作字节流的代码,但在对性能要求不高的地方,利用struct就方便多了。 struct模块定义的数据类型可以参考Python官方文档: https://docs.python.org/3/library/struct.html#format-characters

BMP


hashlib

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。 什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。 摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。 以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

代码语言:javascript
复制
>>> import hashlib
>>> md5 = hashlib.md5()
>>> md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
>>> print(md5.hexdigest())
d26a53750bc40b38b65a520292f69306

如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

代码语言:javascript
复制
import hashlib

md5 = hashlib.md5()
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8'))
print(md5.hexdigest())

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。 另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

代码语言:javascript
复制
>>> import hashlib
>>> sha1 = hashlib.sha1()
>>> sha1.update('how to use sha1 in python hashlib?'.encode('utf-8'))
>>> print(sha1.hexdigest())
2c76b57293ce30acef38d98f6046927161b46a44

SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。 比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法不仅越慢,而且摘要长度更长。

摘要算法应用

摘要算法应用


hmac

Python自带的hmac模块实现了标准的Hmac算法。我们来看看如何使用hmac实现带key的哈希。 我们首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:

代码语言:javascript
复制
>>> import hmac
>>> message = b'Hello, world!'
>>> key = b'secret'
>>> h = hmac.new(key, message, digestmod='MD5')
>>> # 如果消息很长,可以多次调用h.update(msg)
>>> h.hexdigest()
'fa4ee7d173f2d97ee79022d1a7355bcf'

可见使用hmac和普通hash算法非常类似。hmac输出的长度和原始哈希算法的长度一致。需要注意传入的key和message都是bytes类型,str类型需要首先编码为bytes

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.04.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • struct
  • hashlib
    • 摘要算法应用
    • hmac
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档