You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3中替换SHA256初始值实现HMAC*长度扩展攻击的方法问询

实现HMAC*长度扩展攻击的Python方案

嘿,你完全不需要重写SHA256算法!针对你这种自定义HMAC*(SHA256(k || m))的长度扩展攻击,Python里有两种实用的方法,既高效又不用从零实现哈希逻辑:

方法一:用hashpumpy库(推荐)

hashpumpy是专门为长度扩展攻击设计的第三方库,支持SHA256、MD5等多种哈希算法,能自动处理填充计算和初始状态修改,简直是为你的需求量身定做的。

步骤:

  1. 先安装库:
pip install hashpumpy
  1. 编写攻击代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:01:54