Python3学习笔记之-常用内建模块(hashlib、hmac)
目录
Python3学习笔记之-常用内建模块(hashlib、hmac)
一、摘要算法简介(hashlib)
python的hashlib模块针对不同的安全哈希和消息摘要算法实现了一个通用的接口。
包括: FIPS 的 SHA1, SHA224, SHA256, SHA384, and SHA512 (定义于 FIPS 180-2) 算法,以及 RSA 的 MD5 算法。
1、哈希算法
每种类型的hash都有一个构造方法,都会返回一个具有相同的简单接口的hash对象。
例如,使用 use sha256()
创建一个 SHA-256 hash 对象。 你可以使用 update()
方法向这个对象输入字节类对象。 在任何时候你都可以使用 digest()
或 hexdigest()
方法获得到目前为止输入这个对象的拼接数据的 digest。哈希基于字节,所以updata()不支持输入字符串对象。
更简要的写法:
2、属性方法
hash.
digest_size
以字节表示的结果哈希对象的大小。
hash.
block_size
以字节表示的哈希算法的内部块大小。
hash.
update
(data)
用 bytes-like object 来更新哈希对象。 重复调用相当于单次调用并传入所有参数的拼接结果: m.update(a); m.update(b)
等价于 m.update(a+b)
。
注意:为了更好的多线程性能,在对象创建或者更新时,若数据大于2047字节则 Python 的 GIL 会被释放。
hash.digest()
返回当前已传给updata()方法的数据摘要。这是一个大小为digest_size的字节串对象,字节串中可包含0-255的完整取值范围。
hash.hexdigest()
类式于digest()但摘要会以两倍长度字符串对象的形式返回,其中仅包含十六进制数码。这可以被用于在电子邮件或其他非二进制环境中安全地交换数据值,
hash.copy()
返回哈希对象的副本,这可被用来高效地计算共享相同初始子串的数据的摘要。
3、shake可变长度摘要
shake_128()和shake_256()算法提供安全的length_in_bits//2至128或256位可变长度摘要。为此,它们的摘要需指定一个长度。shake算法不限制最大长度。
二、摘要算法应用
任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中:
name | password |
---|---|
michael | 123456 |
bob | abc999 |
alice | alice2008 |
如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。
正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:
username | password |
---|---|
michael | e10adc3949ba59abbe56e057f20f883e |
bob | 878ef96e86145580c38c87f0410ad153 |
alice | 99b1c2188db85afee403b1536010c2c9 |
当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误。
三、基于秘钥的消息验证(hmac)
hmac.
new
(key, msg=None, digestmod='')
返回一个新的 hmac 对象。 key 是一个指定密钥的 bytes 或 bytearray 对象。 如果提供了 msg,将会调用 update(msg)
方法。 digestmod 为 HMAC 对象所用的摘要名称、摘要构造器或模块。 虽然该参数位置靠后,但它却是必须的。
1、方法
hmac.update(msg)
用msg来更新hmac对象,重复调用相当于单次调用并传入所有参数的拼接结果。
hmac.digest()
返回当前已传给 update()
方法的字节串数据的摘要。 这个字节串数据的长度将与传给构造器的摘要的长度 digest_size 相同。 它可以包含非 ASCII 的字节,包括 NUL 字节。
hmac.hexdigest()
类似digest()但摘要会以两倍长度字符串的形式返回,其中仅包含十六进制数码,这可以被用于在电子邮件或其他非二进制环境中安全地交换数据值。
hmac.copy
()
返回 hmac 对象的副本(“克隆)。 这可被用来高效地计算共享相同初始子串的数据的摘要。
2、属性
HMAC.
digest_size
以字节表示的结果 HMAC 摘要的大小。
HMAC.
block_size
¶
以字节表示的哈希算法的内部块大小。
3、辅助函数
hmac.
compare_digest
(a, b)
返回 a == b
。 此函数使用一种经专门设计的方式通过避免基于内容的短路行为来防止定时分析,使得它适合处理密码。 a 和 b 必须为相同的类型:或者是 str