Python hashlib模块详解:安全哈希与消息摘要算法应用

咖啡半糖
咖啡半糖
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python标准库hashlib,介绍MD5、SHA系列等常见摘要算法的原理与区别。通过代码示例演示如何创建Hash对象、更新数据并获取摘要值。重点探讨摘要算法在密码存储中的应用,说明其防篡改特性及与加密算法的区别,帮助开发者安全地处理用户凭证。

官方文档参考:https://docs.python.org/zh-cn/3/library/hashlib.html

hashlib模块概述与算法基础

hashlib模块:安全哈希与消息摘要

Python内置的hashlib模块提供了多种常用的摘要算法支持,例如广泛使用的MD5和SHA1等。

所谓摘要(digest)算法,也被称为哈希(hash)或散列算法。其核心机制是通过特定函数,将任意长度的输入数据转换为固定长度的数据串,该结果通常以16进制字符串形式呈现。

hash算法基础

每种类型的hash算法都提供一个构建器方法,调用该方法会返回一个具有统一简单接口的hash对象。

具体示例如下:

通过调用sha256()可以创建一个SHA-256类型的hash对象。随后,可以使用update()方法向其传入bytes-like object类型的数据。处理完成后,调用digest()或hexdigest()即可获取最终的数据摘要。

hashlib模块内置了多种算法,包括sha1()、sha224()、sha256()、sha384()、sha512()、blake2b()以及blake2s()。此外,若Python环境链接了OpenSSL库,还可支持更多其他算法,具体列表需查阅官方文档。

利用algorithms_guaranteed常量,可以查看在当前Python版本的所有平台上均强制支持的算法集合:


>>> hashlib.algorithms_guaranteed
{'blake2s', 'sha256', 'sha3_512', 'sha1', 'shake_128', 'sha3_256', 'sha3_384', 'blake2b', 'sha3_224', 'sha512', 'md5', 'shake_256', 'sha224', 'sha384'}

使用algorithms_available常量,可获取在当前编译器运行时环境中实际可用的hash算法列表。


>>> hashlib.algorithms_available
{'sha3_256', 'blake2b', 'md5', 'sha512_224', 'sha384', 'md4', 'sha256', 'sha512', 'whirlpool', 'sha224', 'sha512_256', 'shake_128', 'sha3_384', 'ripemd160', 'blake2s', 'sha3_512', 'sha1', 'sm3', 'shake_256', 'sha3_224', 'md5-sha1'}

示例代码展示:


>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b" the spammish repetition")  #重复调用相当于,把bytes字节串相加。
>>> m.name  #hash算法的名字
'sha256'
>>> m.digest() #返回传入update()的数据的摘要
b'U<\x9bP\xb1\xa8\x9a\x9aE\x0f;h\xdb\x04\x11\xc1\x08\xfaH\xa7\t\xbfF\x91\x01\x13\xa1\x87\xb6\xd9`\x96'
>>> m.digest_size  #摘要的大小
>>> m.block_size  #hash算法内的块的大小
>>> m.hexdigest()  #返回一个字符串对象,一般用在安全的email或其他非binary环境
'553c9b50b1a89a9a450f3b68db0411c108fa48a709bf46910113a187b6d96096'
>>>

不同算法的安全性存在差异,例如sha256比sha1更安全,但安全性更高的算法通常计算速度更慢,且生成的摘要长度更长。

摘要算法的应用与密码存储实践

摘要算法的实际应用场景

在保存用户密码时,最佳实践是不存储明文口令,而是存储用户口令的摘要值,例如使用MD5算法生成的哈希值。

摘要算法应用广泛,但需注意:摘要算法并非加密算法,无法通过摘要反推明文,因此不能用于数据加密。它的主要作用是防篡改,凭借单向计算特性,可以在不存储明文口令的情况下验证用户身份。

具体实现示例:

存储MD5摘要值的好处在于,即使运维人员拥有数据库访问权限,也无法直接获知用户的明文口令。

设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:


# -*- coding: utf-8 -*-
db = {
  'michael': 'e10adc3949ba59abbe56e057f20f883e',
  'bob': '878ef96e86145580c38c87f0410ad153',
  'alice': '99b1c2188db85afee403b1536010c2c9'
}

import hashlib

def calc_md5(password):
  m = hashlib.md5()
  m.update(password.encode('utf-8'))
  return m.hexdigest()

def login(user, password):
  return db[user] == calc_md5(password)
    

# 测试:
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')

希望本站整理的这些知识点能对大家有所帮助,感谢各位的支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。