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"。
password和salt是类字节对象,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.
password和salt是类字节对象,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
待补充...实在是编不下去了,对加密算法相关的知识太缺乏了