如何遍历调用Python hashlib库中的各类哈希摘要函数?
问题解答
思路可行性说明
用列表存储哈希算法名称字符串实现遍历的思路完全可行,原代码无法运行的核心问题有两个:
- 调用hashlib方法的语法错误:不存在
hashlib.digest[i]这种调用方式 - 隐藏逻辑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
相关产品推荐
相关产品推荐

