python模块之hashlib

发布时间:2019-09-26 07:19:58编辑:auto阅读(1493)

    hashlib模块实现了多种安全哈希和信息摘要算法的通用接口,包括FIPS中定义的SHA1, SHA224, SHA256, SHA384, SHA512以及RFC 1321中定义的MD5

    注意点:
    1. adler32及crc32哈希由zlib模块提供
    2. 某些算法已知存在哈希碰撞弱点

    哈希算法

    每个hash算法都有一个同名的构造函数,并返回拥有相同接口的hash对象

    sha1(), sha224(), sha256(), sha384(), sha512(), blake2b()以及blake2s()这些构造函数在hashlib模块中总是可用。md5()通常也可用,但在某些罕见的python版本(“FIPS compliant” build of Python)中例外。取决于所用平台上python使用的OpenSSL,hashlib也支持某些额外的算法,在大多数平台上,sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256()都是可用的。

    >>> import hashlib
    >>> m = hashlib.sha256()
    >>> m.update(b"Nobody inspects")
    >>> m.update(b" the spammish repetition")
    >>> m.digest()
    b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'

    或者更精简的方式:

    >>> hashlib.sha256(b"Nobody inspects the spammish repetition").digest()
    b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'

    hashlib.new(name[, data])

    通用构造函数,name参数表示要使用的hash算法的名称,可以是上述列出的所有hash算法以及OpenSSL库支持的其他算法。使用算法名称构造函数较使用new()更快

    >>> h = hashlib.new("sha256", b"Nobody inspects the spammish repetition")
    >>> h.digest()
    b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'

    hashlib.algorithms_guaranteed

    所有平台的hashlib模块都支持的hash算法的名称集合。md5也在此集合中(Note that ‘md5’ is in this list despite some upstream vendors offering an odd “FIPS compliant” Python build that excludes it.)。

    hashlib.algorithms_available

    当前运行的python解释器支持的hash算法的名称集合,在new()构造函数中使用都能被正确识别。同一算法可能以不同名称出现多次。
    hashlib.algorithms_guaranteed的结果集总是hashlib.algorithms_available结果集的子集

    hash.digest_size

    hash对象的字节长度

    hash.block_size

    hash对象的内部块大小

    hash.name

    hash对象的名称

    hash.update(data)

    传递类字节参数(通常是bytes)更新hash对象。重复调用update()等同于单次的拼接调用:m.update(a); m.update(b)等同m.update(a+b)

    从python3.1开始,为了更好的多线程性能,使用OpenSSL支持的hash算法且处理数据量大于2047个字节的update(或创建)操作发生时,将释放python全局解释器锁允许其他线程运行

    hash.digest()

    截止此方法调用时,update()已接收的数据的摘要,是一个可包含0到255之间所有字节的字节对象

    hash.hexdigest()

    类似于digest(),不过是以双倍长度的只包含十六进制数字的字符串对象返回摘要值。

    hash.copy()

    返回hash对象的克隆

    SHAKE算法的可变长度摘要

    The shake_128() and shake_256() algorithms provide variable length digests with length_in_bits//2 up to 128 or 256 bits of security

    shake.digest(length)

    同hash.digest()

    shake.hexdigest(length)

    同hash.hexdigest()

    密钥导出

    密钥导出和扩展算法是为安全密码散列设计的。类似sha1(password)这种简单算法不能有效抵御暴力破解,一个好的密码散列函数必须是可调节的,耗时的,并包含盐

    hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)

    pbkdf2_hmac()提供了使用PKCS#5填充的pbkdf2算法,使用HMAC作为伪随机函数。

    hash_name表示HMAC的哈希摘要算法的名称,比如"sha1"或"sha256"。

    passwordsalt是类字节对象,password长度应该限制在一个合理范围之间,salt长度应该在16个字节以上且来源恰当。

    iterations表示迭代次数,基于hash算法以及机器计算能力设置。截止2013年,sha256算法建议最少进行10万次迭代

    dklen表示导出密钥的长度。默认值为None,使用hash_name算法计算的hash对象的digest_size属性长度

    >>> import hashlib, binascii
    >>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
    >>> binascii.hexlify(dk)
    b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

    Note: A fast implementation of pbkdf2_hmac is available with OpenSSL. The Python implementation uses an inline version of hmac. It is about three times slower and doesn’t release the GIL.

    hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)

    The function provides scrypt password-based key derivation function as defined in RFC 7914.

    passwordsalt是类字节对象,password长度应该限制在一个合理范围之间,salt长度应该在16个字节以上且来源恰当。

    n is the CPU/Memory cost factor, r the block size, p parallelization factor and maxmem limits memory (OpenSSL 1.1.0 defaults to 32 MiB). dklen is the length of the derived key.

    BLAKE2

    待补充...实在是编不下去了,对加密算法相关的知识太缺乏了

关键字