pin_drop当前位置:知识文库 ❯ 图文
Python hashlib.sha256详解 - SHA-256哈希算法与密码存储
一、概述
hashlib.sha256() 是 hashlib 模块中用于计算 SHA-256(Secure Hash Algorithm 256-bit)哈希值的函数。SHA-256 是 SHA-2 系列算法之一,将任意长度的数据映射为 256 位(32 字节)的摘要值。SHA-256 目前被认为是安全的,广泛应用于数字签名、TLS/SSL 证书、区块链、密码存储等安全敏感场景。
二、语法
代码示例
import hashlib
# 一步计算
result = hashlib.sha256(b'data').hexdigest()
# 分步计算
h = hashlib.sha256()
h.update(b'data')
result = h.hexdigest()三、参数说明
四、返回值
返回 SHA-256 哈希对象。hexdigest() 返回 64 字符的十六进制字符串,digest() 返回 32 字节的字节串。
五、代码示例
示例1:基本SHA-256计算
代码示例
import hashlib
data = b'Hello, SHA-256!'
sha256_hash = hashlib.sha256(data).hexdigest()
print(f"数据: {data}")
print(f"SHA-256: {sha256_hash}")
print(f"长度: {len(sha256_hash)} 字符")输出:
代码示例
数据: b'Hello, SHA-256!'
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
长度: 64 字符示例2:密码哈希存储
代码示例
import hashlib
import os
def hash_password(password: str, salt: bytes = None) -> tuple:
"""使用SHA-256+盐值哈希密码"""
if salt is None:
salt = os.urandom(16)
hashed = hashlib.sha256(salt + password.encode('utf-8')).hexdigest()
return hashed, salt.hex()
def verify_password(password: str, hashed: str, salt_hex: str) -> bool:
"""验证密码"""
salt = bytes.fromhex(salt_hex)
computed = hashlib.sha256(salt + password.encode('utf-8')).hexdigest()
return computed == hashed
# 注册:存储密码哈希
password = "MySecurePassword123"
hashed, salt = hash_password(password)
print(f"密码哈希: {hashed}")
print(f"盐值: {salt}")
# 登录:验证密码
print(f"\n正确密码验证: {verify_password('MySecurePassword123', hashed, salt)}")
print(f"错误密码验证: {verify_password('WrongPassword', hashed, salt)}")输出:
代码示例
密码哈希: a1b2c3d4e5f6789012345678abcdef0123456789abcdef0123456789abcdef01
盐值: 0102030405060708090a0b0c0d0e0f10
正确密码验证: True
错误密码验证: False示例3:数据指纹与去重
代码示例
import hashlib
def compute_fingerprint(data):
"""计算数据指纹"""
return hashlib.sha256(data.encode('utf-8')).hexdigest()[:16]
# 模拟数据去重
documents = [
"Python is a programming language",
"Python is a programming language", # 重复
"Java is also a programming language",
"Python is a programming language", # 重复
"Rust is a systems programming language"
]
seen = {}
unique_docs = []
for doc in documents:
fp = compute_fingerprint(doc)
if fp not in seen:
seen[fp] = doc
unique_docs.append(doc)
print(f"原始文档数: {len(documents)}")
print(f"去重后文档数: {len(unique_docs)}")
print(f"节省: {len(documents) - len(unique_docs)} 个重复")
for doc in unique_docs:
print(f" - {doc}")输出:
代码示例
原始文档数: 5
去重后文档数: 3
节省: 2 个重复
- Python is a programming language
- Java is also a programming language
- Rust is a systems programming language六、实际应用场景
-
密码存储:配合盐值使用 SHA-256 存储密码哈希,防止彩虹表攻击。
-
数字签名:对消息计算 SHA-256 摘要后签名,确保消息完整性和来源可信。
-
区块链:SHA-256 是比特币等区块链系统的核心哈希算法。
七、注意事项
注意1:直接使用 SHA-256 存储密码仍不够安全(容易被暴力破解)。推荐使用
pbkdf2_hmac()进行多轮迭代。
注意2:SHA-256 的安全性依赖于盐值的随机性。盐值应使用
os.urandom()生成,不要使用可预测的值。
注意3:SHA-256 计算速度较快,这在密码存储场景是缺点(攻击者可以快速尝试大量密码)。应使用 PBKDF2 增加计算成本。
提示:SHA-256 是目前推荐的通用安全哈希算法,在大多数安全场景中替代 MD5 和 SHA-1。
八、相关方法对比
九、小结
-
hashlib.sha256()计算 SHA-256 哈希值,输出 256 位(64 字符十六进制)摘要 -
SHA-256 是目前推荐的通用安全哈希算法
-
密码存储应配合盐值和 PBKDF2 使用,不要直接存储 SHA-256 哈希
-
SHA-256 广泛应用于数字签名、TLS 证书、区块链等领域
十、练习题
练习1
编写一个函数,使用 SHA-256 和随机盐值安全地哈希密码,并编写验证函数。
练习2
编写一个程序,计算目录中所有文件的 SHA-256 哈希值,找出内容相同的文件。
练习3
对比 SHA-256 和 MD5 的计算速度,编写基准测试。
常见问题
SHA-256 和 SHA-512 哪个更安全?
SHA-512 安全性更高(512 位摘要 vs 256 位摘要),但 SHA-256 目前已足够安全,且存储开销更小。除非有极高安全需求,SHA-256 通常是更好的选择。
为什么不能直接用 SHA-256 存储密码?
SHA-256 计算速度过快,攻击者可以使用 GPU 每秒尝试数十亿次密码。推荐使用 PBKDF2、bcrypt 或 Argon2 等专门的密码哈希算法,它们通过多轮迭代增加计算成本。
SHA-256 会被破解吗?
截至 2026 年,SHA-256 尚未被证明存在碰撞漏洞。量子计算可能对 SHA-256 构成潜在威胁,但目前实用的量子计算机还无法攻击它。对于大多数应用,SHA-256 仍然是安全的选择。
SHA-256 在区块链中有什么作用?
SHA-256 是比特币的共识算法核心,用于工作量证明(PoW)挖矿和区块链接。每个区块的哈希值都包含前一个区块的 SHA-256 哈希,形成不可篡改的链式结构。
本文涉及AI创作
内容由AI创作,请仔细甄别