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

如何遍历调用Python hashlib库中的各类哈希摘要函数?

问题解答

思路可行性说明

用列表存储哈希算法名称字符串实现遍历的思路完全可行,原代码无法运行的核心问题有两个:

  1. 调用hashlib方法的语法错误:不存在hashlib.digest[i]这种调用方式
  2. 隐藏逻辑bug:文件对象迭代一次后指针会停在文件末尾,第二个及之后的算法遍历字典时会读取不到任何内容

修复方案1:保留字符串列表(推荐,灵活度最高)

直接使用hashlib内置的new()方法,支持直接传入算法名称字符串生成对应的哈希对象,不需要修改你的算法列表:

import hashlib

digest = ["sha1", "sha256", "md5"]

s = "5UA@/Mw^%He]SBaU".encode('utf-8')
target_hash = "3281e6de7fa3c6fd6d6c8098347aeb06bd35b0f74b96f173c7b2d28135e14d45"

# 预读字典内容到内存,避免重复读文件
with open("dictionary.txt", "r", encoding="utf-8") as f:
    dictionary = [line.strip() for line in f]

for algo_name in digest:
    for pwd in dictionary:
        test_bytes = pwd.encode('utf-8') + s
        # 核心修改:用hashlib.new传入算法名生成哈希对象
        current_hash = hashlib.new(algo_name, test_bytes).hexdigest()
        print(current_hash)
        if current_hash == target_hash:
            print("the password is:", pwd)
            exit() # 找到密码直接退出

其他可实现遍历的方案

如果不想用字符串列表,也可以采用以下两种方案:

  • 方案2:直接存储哈希函数对象到列表
    直接把hashlib的函数本身存入列表,不需要转换字符串,调用更直接:
    digest = [hashlib.sha1, hashlib.sha256, hashlib.md5]
    # 调用的时候直接传入数据即可
    current_hash = algo_func(test_bytes).hexdigest()
    
  • 方案3:通过getattr动态获取函数
    利用Python反射特性从hashlib模块中获取对应名称的函数:
    algo_func = getattr(hashlib, algo_name)
    current_hash = algo_func(test_bytes).hexdigest()
    

注意事项

  • 部分安全合规环境下可能会禁用md5、sha1等弱哈希算法,建议加异常捕获处理不支持的算法场景
  • 字典较大时预读到内存会占用较多内存,可以改成每个算法遍历前重新打开文件,权衡IO开销和内存开销即可

内容的提问来源于stack exchange,提问作者01Cyber_cyber10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:54:01