

Python,速成心法
敲代码,查资料,问度娘
练习,探索,总结,优化

★★★★★博文创作不易,源码使用过程中,如有疑问的地方,欢迎大家指正留言交流。喜欢的老铁可以多多点赞+收藏分享+置顶,小红牛在此表示感谢。★★★★★
Python模块教程:ctypes模块示例演示(用Python调用C 语言)
hmac 是 Python 标准库中的一个模块,用于实现 HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码)算法。HMAC 结合了密钥与哈希函数(如 MD5、SHA‑1、SHA‑256 等),可以同时验证消息的完整性和真实性。
核心用途
3.安全性:安全性依赖于底层哈希函数的强度。推荐使用 SHA‑256 或更安全的哈希算法,避免使用已破解的 MD5 或 SHA‑1(除非在遗留系统中)。比较 HMAC 时务必使用 hmac.compare_digest(),它可以抵御时序攻击(timing attack)。
下面展示如何使用 hmac 模块生成和验证 HMAC,并演示推荐的安全比较方法。输出以下内容
密钥(十六进制): edee03e6d34056353027517390ee2706ae88480ac9744a0709ef5e7bf5d25513消息: Hello, HMAC world!HMAC (hex): bd4cfdccda3aad0575812c055b3c52113a175c4674288a17dfc4cfb128c4d51b正确 HMAC 验证结果: True篡改消息验证结果: False错误密钥验证结果: FalseHMAC-SHA512: a4f13d8c139adf523e3356850d77c8139e606c60e9bd70e77a60e257cf1dc671fc67cf0034c3d13a5e94942a5537aa83918be709ff8dfc77146fdba030d9e4fdHMAC-MD5 (仅示意): 462acd7c9c1e3878f83aa1d78dd8ef80
↓ 源码如下 ↓
# -*- coding: utf-8 -*-# @Author : 小红牛# 微信公众号:wdPythonimport hmacimport hashlibimport os# ---------- 1. 生成 HMAC ----------# 密钥(实际应用中应安全存储,此处随机生成)secret_key = os.urandom(32) # 32 字节随机密钥message = b"Hello, HMAC world!" # 消息必须是 bytes# 方法一:使用 new() 逐步更新hmac_obj = hmac.new(secret_key, digestmod=hashlib.sha256)hmac_obj.update(message)hmac_value = hmac_obj.digest() # 字节串hmac_hex = hmac_obj.hexdigest() # 十六进制print(f"密钥(十六进制): {secret_key.hex()}")print(f"消息: {message.decode()}")print(f"HMAC (hex): {hmac_hex}")# 方法二:直接使用 digest() 函数(Python 3.7+)hmac_value_direct = hmac.digest(secret_key, message, hashlib.sha256)assert hmac_value == hmac_value_direct # 结果相同# ---------- 2. 验证 HMAC ----------def verify_hmac(key, msg, received_hmac, digestmod=hashlib.sha256):"""安全地验证收到的 HMAC 是否正确"""# 重新计算 HMACcomputed_hmac = hmac.digest(key, msg, digestmod)# 使用 compare_digest 防止时序攻击return hmac.compare_digest(computed_hmac, received_hmac)# 正确场景is_valid = verify_hmac(secret_key, message, hmac_value)print(f"\n正确 HMAC 验证结果: {is_valid}") # True# 篡改场景(消息被修改)tampered_msg = b"Hello, HMAC world?!" # 末尾改了一个字符is_valid_tampered = verify_hmac(secret_key, tampered_msg, hmac_value)print(f"篡改消息验证结果: {is_valid_tampered}") # False# 密钥错误场景wrong_key = os.urandom(32)is_valid_wrong_key = verify_hmac(wrong_key, message, hmac_value)print(f"错误密钥验证结果: {is_valid_wrong_key}") # False# ---------- 3. 使用不同哈希算法 ----------# SHA-512 示例hmac_sha512 = hmac.new(secret_key, message, hashlib.sha512).hexdigest()print(f"\nHMAC-SHA512: {hmac_sha512}")# 不推荐但可行的 MD5(除非必须兼容旧系统)hmac_md5 = hmac.new(secret_key, message, hashlib.md5).hexdigest()print(f"HMAC-MD5 (仅示意): {hmac_md5}")# ---------- 4. 流式处理大消息 ----------# 对于大文件或流数据,可以分块更新,避免一次加载全部数据def compute_hmac_stream(key, file_path, digestmod=hashlib.sha256, chunk_size=4096):h = hmac.new(key, digestmod=digestmod)with open(file_path, 'rb') as f:while chunk := f.read(chunk_size):h.update(chunk)return h.digest()# 假设存在一个大文件,可以这样调用(示例中不实际创建large文件)# file_hmac = compute_hmac_stream(secret_key, "large.bin")# print(f"文件 HMAC: {file_hmac.hex()}")
完毕!!感谢您的收看
--------★★历史博文集合★★--------
