Python3中替换SHA256初始值实现HMAC*长度扩展攻击的方法问询
实现HMAC*长度扩展攻击的Python方案
嘿,你完全不需要重写SHA256算法!针对你这种自定义HMAC*(SHA256(k || m))的长度扩展攻击,Python里有两种实用的方法,既高效又不用从零实现哈希逻辑:
方法一:用hashpumpy库(推荐)
hashpumpy是专门为长度扩展攻击设计的第三方库,支持SHA256、MD5等多种哈希算法,能自动处理填充计算和初始状态修改,简直是为你的需求量身定做的。
步骤:
- 先安装库:
pip install hashpumpy
- 编写攻击代码:
import hashpumpy # 替换成你已知的参数 known_hmac_hex = "你的已知HMAC*十六进制值" original_message = b"原始消息m的字节内容" append_message = b"要附加的任意消息a" # 因为未知密钥k的长度,我们需要枚举可能的长度(比如0到64字节,覆盖常见密钥长度) for key_length in range(0, 65): # hashpump自动完成:计算填充、修改哈希初始状态、生成新的HMAC*和新消息 new_hmac_hex, new_full_message = hashpumpy.hashpump( known_hmac_hex, original_message, append_message, key_length ) print(f"尝试密钥长度{key_length}:") print(f" 新HMAC*值: {new_hmac_hex}") print(f" 新消息m': {new_full_message}\n")
这个库会帮你搞定所有底层细节——包括SHA256的填充规则、初始向量替换,你只需要传入已知参数和枚举密钥长度就行。
方法二:手动修改hashlib的SHA256内部状态(无依赖)
如果你不想用第三方库,可以直接操作Python标准库hashlib的SHA256对象内部状态,前提是你用的是CPython(因为这个方法依赖CPython的私有实现细节)。
核心思路:
SHA256的哈希过程是基于初始向量(h0-h7)迭代计算的,我们可以把已知的HMAC*值拆分成初始向量,替换SHA256对象的默认初始状态,然后继续计算附加消息的哈希。
代码实现:
import hashlib import struct def sha256_custom_iv(iv_hex, data): """用自定义初始向量计算SHA256哈希""" # 将十六进制IV转成8个32位大端整数(对应h0-h7) iv_bytes = bytes.fromhex(iv_hex) iv = struct.unpack('>8I', iv_bytes) # 创建SHA256对象并替换初始状态 sha = hashlib.sha256() # 替换内部状态:iv + (已处理的比特数高64位, 已处理的比特数低64位) # 这里的比特数是k||m的总长度,后续update时会自动更新 sha._sha256.state = iv + (0, 0) # 更新数据并返回哈希值 sha.update(data) return sha.hexdigest() def sha256_pad(length_bytes): """计算SHA256的填充字节,输入是待填充数据的字节长度""" length_bits = length_bytes * 8 pad = b'\x80' # 填充起始位 # 计算需要补充的0字节数,使得总长度模64等于56 pad += b'\x00' * ((56 - (length_bytes + 1) % 64) % 64) # 追加64位的长度表示(大端) pad += struct.pack('>Q', length_bits) return pad # 已知参数 known_hmac_hex = "你的已知HMAC*十六进制值" original_message = b"原始消息m的字节内容" append_message = b"要附加的任意消息a" # 枚举密钥长度 for key_length in range(0, 65): # 计算k||m的总字节长度 total_length = key_length + len(original_message) # 生成填充 padding = sha256_pad(total_length) # 构造新消息 new_message = original_message + padding + append_message # 计算新HMAC*:用已知HMAC作为初始向量,计算append_message的哈希 new_hmac = sha256_custom_iv(known_hmac_hex, append_message) print(f"尝试密钥长度{key_length}:") print(f" 新HMAC*值: {new_hmac}") print(f" 新消息m': {new_message}\n")
注意事项:
- 这个方法依赖CPython的私有属性
_sha256.state,在PyPy等其他Python实现中可能无法运行; - 必须保证初始状态的比特数设置逻辑正确,上面的代码中
update操作会自动更新已处理比特数,符合长度扩展攻击的计算逻辑。
关键说明
因为你的HMAC*是直接拼接密钥和消息的SHA256(k||m),而非标准HMAC的嵌套哈希结构,所以长度扩展攻击完全适用——标准HMAC正是通过嵌套结构避免了这类攻击的。
内容的提问来源于stack exchange,提问作者Atilla1899
相关产品推荐
相关产品推荐

