美文网首页
Day15内建模块struct&hashlib&

Day15内建模块struct&hashlib&

作者: 林清猫耳 | 来源:发表于2018-04-08 23:52 被阅读17次

    struct

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

    >>> bs = bytes([b1,b2,b3,b4])
    >>> bs
    b'\x00\x9c@c'
    

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

    >>> 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值:

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

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

    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完全类似:

    >>> 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的代码如下:

    >>> 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

    相关文章

      网友评论

          本文标题:Day15内建模块struct&hashlib&

          本文链接:https://www.haomeiwen.com/subject/dawmhftx.html