Python3 hashlib模块:密码散列算法原理与实战应用
本文深入解析Python3中hashlib模块的使用原理,涵盖MD5、SHA系列等主流密码散列算法。通过具体代码示例展示如何创建散列对象、计算摘要及处理Unicode数据,并重点讲解利用update方法进行增量更新以优化大文件处理效率的实战技巧。
hashlib模块概述
1.hashlib密码散列
hashlib模块提供了一套统一的API接口,用于访问多种不同的密码散列算法。在实际使用中,开发者可以通过调用相应的构造器函数或new()方法来创建特定的散列对象。无论选择哪种具体的算法,这些对象均遵循相同的操作接口规范。
支持的散列算法
1.1 散列算法
得益于OpenSSL提供的底层支持,hashlib能够使用OpenSSL库中提供的所有算法,具体包括:
- md5
- sha1
- sha224
- sha256
- sha384
- sha512
部分算法在所有平台上均可用,而另一些则依赖于底层库的支持。这两种情况分别通过algorithms_guaranteed和algorithms_available属性来提供查询。
算法可用性查询示例
import hashlib
print('Guaranteed:\n{}\n'.format(
', '.join(sorted(hashlib.algorithms_guaranteed))))
print('Available:\n{}'.format(
', '.join(sorted(hashlib.algorithms_available))))
Guaranteed: blake2b, blake2s, md5, sha1, sha224, sha256, sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256 Available: DSA, DSA-SHA, MD4, MD5, RIPEMD160, SHA, SHA1, SHA224, SHA256, SHA384, SHA512, blake2b, blake2s, dsaEncryption, dsaWithSHA, ecdsa-with-SHA1, md4, md5, ripemd160, sha, sha1, sha224, sha256, sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256, whirlpool
MD5计算实战
1.2 MD5示例
若要为一个数据块(在此例中为转换为字节串的Unicode字符串)计算MD5散列或摘要,首先需要创建散列对象,接着添加数据,最后调用digest()或hexdigest()方法。
MD5代码示例
import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.md5()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())
本示例采用了hexdigest()方法而非digest(),目的是格式化输出以便清晰打印。若接受二进制摘要值,则可直接使用digest()。

SHA1计算实战
1.3 SHA1示例
SHA1摘要的计算方式与上述过程相同。
SHA1代码示例
import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.sha1()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())
由于MD5和SHA1算法存在差异,因此生成的摘要值也会不同。

增量更新技术
1.4 增量更新
散列计算器的update()方法支持反复调用。每次调用时,都会根据提供的附加文本更新摘要。相比将整个文件一次性读入内存,增量更新不仅效率更高,且能生成完全相同的结果。
增量更新代码示例
import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.md5()
h.update(lorem.encode('utf-8'))
all_at_once = h.hexdigest()
def chunkize(size, text):
"Return parts of the text in size-based increments."
start = 0
while start < len(text):
chunk = text[start:start + size]
yield chunk
start += size
return
h = hashlib.md5()
for chunk in chunkize(64, lorem.encode('utf-8')):
h.update(chunk)
line_by_line = h.hexdigest()
print('All at once :', all_at_once)
print('Line by line:', line_by_line)
print('Same :', (all_at_once == line_by_line))
此示例展示了在读取或生成数据时,如何以增量方式更新摘要。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













