python hashlib模块简介
一、hashlib模块里有什么
hashlib模块提供了多种安全散列和消息摘要算法的公共接口。
校验和算法adler32或crc32则在zlib模块中提供。[1]
在hashlib模块中,sha1()、sha224()、sha256()、sha384()、sha512()和blake2b()、blake2s()方法总是存在的。
md5()方法通常也是可用的。如果使用了罕见的兼容美国联邦信息处理标准(FIPS compliant)的python,则md5()可能会不能用(MD5的安全性不够高的原因)。
其它算法是否可用依赖于python所在操作系统的OpenSSL库。在大多数操作系统中,sha3_224()、sha3_256()、sha3_384()、sha3_512()和shake_128()、shake_256()是可用的。
具体哪些散列算法能用,可以用下面的常量来查看。
使用前先导入:
import hashlib
可以使用常量:
hashlib.algorithms_available 或 hashlib.algorithms_guaranteed来获取本模块支持的散列算法集合。
hashlib.algorithms_available
返回可用的散列函数名集合。包含了sha384,sha521,md5等32个散列函数。
注意,相同的函数可能会以不同名字(大小写)出现多次。
{'RIPEMD160', 'sha224', 'sha3_224', 'SHA384', 'blake2s', 'blake2b',
'sha3_512', 'sha1', 'DSA', 'ripemd160', 'sha3_384', 'sha3_256',
'sha', 'shake_128', 'sha512', 'ecdsa-with-SHA1', 'shake_256',
'SHA', 'SHA512', 'dsaEncryption', 'MD5', 'SHA256', 'DSA-SHA',
'whirlpool', 'MD4', 'dsaWithSHA', 'SHA224', 'sha256', 'md4',
'sha384', 'md5', 'SHA1'}
hashlib.algorithms_guaranteed
返回本模块支持的散列函数名集合。包含了sha3_256、md5等14个散列函数。此时没有大小写问题了。
algorithms_guaranteed返回结果是 algorithms_available返回结果的子集。
{'shake_256', 'sha224', 'sha3_224', 'blake2s', 'blake2b',
'sha3_512', 'sha1', 'shake_128', 'sha3_384', 'sha256',
'sha3_256', 'sha384', 'md5', 'sha512'}
二、散列算法的应用场景
这些散列函数经常应用于一致性验证、数字签名、安全访问认证等场合。[2]
比如用MD5(信息摘要算法第5版)进行文件一致性验证。
每个文件的MD5值就像是这个文件的“数字指纹”。如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”就会发生变化。
在软件下载操作中,通过比较前后这两个MD5值是否相同,就能判断下载的文件是否出错,或者说下载的文件是否被篡改了。
三、使用示例
blake2b
blake2s
md5
sha1
sha224
sha256
sha384
sha512
sha3_224
sha3_256
sha3_384
sha3_512
shake_128
shake_256
这些散列算法的使用方式都是相同的,因为它们返回的都是具有相同接口的散列对象。
比如使用sha256()方法创建SHA-256散列对象,用字节型数据当参数调用update()方法,
用digest()或hexdigest()方法获得相应的摘要信息。
演示代码如下:
#coding=utf-8
import hashlib
text = b'hello world.'
hs = hashlib.sha256()
hs.update(text)
out_text = hs.hexdigest()
print(text, '\n==> ', out_text)
# 内容是中文时注意编码转换
msg = '代码小工蚁'.encode('utf-8')
msg_hs = hashlib.sha256()
msg_hs.update(msg)
out_msg = msg_hs.hexdigest()
print(msg, '\n==> ', out_msg)
print(len(out_msg)) # 长度64位
注意:
1、update()方法的参数要是字节型,英文字符可以在字符串前加b来标识,中文等非ASCII字符要进行编码转换。
如:msg = '代码小工蚁'.encode('utf-8')
msg = bytes('代码小工蚁', encoding='utf-8')
2、对同一个hash对象进行update()操作实际上相当于参数拼接后的update()。
即hs.update(b'abc'),再来hs.update(b'def'),相当于hs.update(b'abc' + b'def'),同hs.update(b'abcdef')
3、散列对象的hexdigest()方法返回字符型摘要信息(处理结果),digest()返回的是字节型的摘要信息。
百度翻译API的代码片断:
# 申请API地址:
# http://api.fanyi.baidu.com/api/trans/product/index
appid = '2018***********78'
secretKey = 'Qw6n**************fW'
myurl = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
q = trans_text
fromLang = 'en'
toLang = 'zh'
salt = random.randint(32768, 65536)
sign = appid+q+str(salt)+secretKey
m1 = hashlib.md5()
m1.update(sign.encode('utf-8'))
sign = m1.hexdigest()
myurl = myurl+'?appid='+appid+'&q='+quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
代码说明:
百度翻译API使用的md5()方法。
salt = random.randint(32768, 65536)
使用随机整数“加盐”(增加额外的信息,提高复杂度,使信息摘要更有隐蔽性)
四、存在问题及发展
SHA-1存在严重的安全问题。2017年2月份,CWI Amsterdam和Google宣布实现对SHA-1碰撞攻击。
(总计约900万兆次SHA1计算。完成攻击的首个阶段需要单一CPU计算6500年。)[3]
SHA-2家族包括:SHA-256、SHA-384和SHA-512以及SHA-224。
SHA-3竞赛获胜算法Keccak算法成为SHA-3,也是一个哈希家族。
BLAKE2的定位是目前安全系数最高的哈希函数。其中:
BLAKE2b是BLAKE的64位版本,它可以生成最高512位的任意长度哈希。
BLAKE2s是BLAKE的32位版本,它可以生成最高256位的任意长度哈希。
BLAKE2的速度比MD5、SHA-1要快。[4]
有人说,只需要一个智能手机30秒就能破解md5。[3]
我尝试了一下,8位0-9纯数字的MD5暴力破解花了约140秒。
看来程序还要优化。
* 所有示例在WIN7 64位系统上执行python3.6.1通过。
[1]hashlib (python 3.6)官方文档:
https://docs.python.org/3.6/library/hashlib.html#hash-algorithms
[2]百度百科:MD5、SHA家族
[3]SHA-1被破解始末
https://mp.weixin.qq.com/s/ND9zg3YJmi13OHN28hP5QQ
[4]BLAKE2简介
https://blog.csdn.net/u010129119/article/details/79105208