hashlib模块
by: uizuizui
功能描述:hashlib模块实现了许多不同种类的安全散列(消息摘要)算法,并提供了相应的接口。hashlib模块用于生成hash对象,hash对象则使用指定的算法生成消息摘要。
一、生成hash对象
生成hash对象有两种途径:
-
使用与算法名字相同的构造器生成。由于需要兼容不同的平台,hashlib模块仅提供了6种可以兼容所有平台的构造器。分别是:md5()、sha1()、sha224()、sha256()、sha384()和sha512()。这些构造器生成的hash对象可以运行在任何环境中。
import hashlib
hash = hashlib.md5()
type(hash)
# <class '_hashlib.HASH'> -
new(name, data=b”)函数。该函数第一个参数name代表需要使用的Hash算法的名字(str类型)。第二个参数data代表生成消息摘要的源数据,这个参数必须为bytes类型。(不可以传入str类型,因为str和bytes在本质上是不同的,相关信息请自行查阅,博主后面也会写一篇文讲Python上的编码)new函数会对name参数进行检查,确保可以调用正确的Hash算法。
import hashlib
hash = hashlib.new('md5') # 第二个参数不是必选
type(hash)
# <class '_hashlib.HASH'>
注意:使用第一种方式生成hash对象会比第二种方式快,因为第二种方式还需要在内部进行检查和适配算法。所以在明确需要使用的算法在hashlib提供的构造器范围内时,应当尽可能使用第一种方式。
二、查看hashlib支持的算法集合
使用hashlib提供的字段可以查看系统支持的算法:
hashlib.algorithms_guaranteed,返回一个集合,该集合包含由模块支持的所有Hash算法。(也就是上面提到的6种)
hashlib.algorithms_available,返回一个集合,该集合包含所有可以在Python解释器运行的Hash算法。(由OpenSSL提供)hashlib.algorithms_guaranteed永远是该集合的子集。相同的算法可能会以不同名字(大小写)在该集合中出现多次。
import hashlib
print(hashlib.algorithms_guaranteed)
# {'sha512', 'sha384', 'sha1', 'md5', 'sha224', 'sha256'}
print(hashlib.algorithms_available)
# {'SHA1', 'sha384', 'dsaWithSHA', 'RIPEMD160', 'ecdsa-with-SHA1', 'sha1', 'MD5', 'md5', 'sha224', 'sha', 'SHA512', 'whirlpool', 'sha512', 'SHA', 'SHA224', 'md4', 'DSA-SHA', 'SHA384', 'dsaEncryption', 'MD4', 'ripemd160', 'SHA256', 'sha256', 'DSA'}
三、hash对象公用接口
无论使用哪种构造器生成出来的hash对象,接口都是相同的。
update(arg)函数。该函数为hash对象提供源。参数和new函数的data参数一样必须是bytes。重复调用这个函数,后面的数据会累加。也就是说:hash.update(m);hash.update(n)等于hash.update(m+n)。
digest()。返回Hash算法计算得到的消息摘要,bytes类型。
hexdigest()。返回消息摘要的十六进制形式,str类型。
copy()。返回调用该函数的hash对象的一个拷贝。当需要形成消息摘要的数据有共同的子串时有用。
digest_size。int值,代表Hash算法返回值的字长。
block_size。int值,代表Hash算法内部块的字长。
name。str类型,代表hash对象使用的Hash算法名字。在部分平台上无法读取
示例代码:
import hashlib
hash = hashlib.md5()
hash.update(b'hello')
print(hash.digest())
# b']A@*\xbcK*v\xb9q\x9d\x91\x10\x17\xc5\x92'
print(hash.hexdigest())
# '5d41402abc4b2a76b9719d911017c592'
print(hash.digest_size)
# 16
print(hash.block_size)
# 64
print(hash.name)
# 'md5'
四、对密码进行加密
使用普通的Hash算法并不安全,很容易被暴力破解。所以在对密码进行加密时可以使用更安全的pbkdf2_hmac。
pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)
- hash_name指加密算法的名字。比如:sha1、sha256等。
- password指要加密的密码。为字节串。
- salt指撒盐法,可以由os.urandom(n)生成,字节串,长度一般要大于16。
- iterations指循环次数。越大越好,官方文档里建议调用SHA-256时以2013年的计算能力至少在十万次以上。
- 如果dklen=None,指返回的密钥的长度,会根据加密算法来定返回的digest的长度。
OpenSSL提供了一个pbkdf2_hmac的快速实现版本,比Python自带的快。
以上内容参考hashlib模块官方文档:
https://docs.python.org/3.5/library/hashlib.html#hash-algorithms
第四节内容参考自:
http://blog.csdn.net/python_tty/article/details/50937287
http://www.cnblogs.com/Security-Darren/p/4169423.html
感谢以上内容提供者,感谢模块提供者和OpenSSL。