Python编写的MD5哈希破解程序处理密码列表超4750行时意外停止
故障根因分析
- 循环终止逻辑错误:当前用
while (line := file.readline().rstrip())作为循环判断条件,只要读取到的行经过rstrip()处理后为空(比如密码列表中存在空行、全空格/换行符的行),判断条件就会返回False,循环直接终止,完全不会继续读取后面的内容。4750行后终止大概率是第4750行附近存在空行。
- 循环终止逻辑错误:当前用
- 文件读取编码未显式指定:打开
passwordlist.txt时没有指定编码参数,不同操作系统默认编码不同,一旦密码列表中存在超出默认编码范围的特殊字符,程序会直接抛出编码异常终止。
- 文件读取编码未显式指定:打开
- 冗余的第三方库安装逻辑:
hashlib是Python官方标准库,不存在需要pip安装的情况,原有异常捕获逻辑完全冗余,误触发时反而会安装pip源里废弃的hashlib占位包,导致运行异常。
- 冗余的第三方库安装逻辑:
修复后代码
import hashlib def test_hash(target, string): hashed = hashlib.md5(string.encode('utf-8')).hexdigest() if target == hashed: print(f'Found coincidence at -> {string}') return 1 return 0 target_hash = 'an-md5-hash' if __name__ == '__main__': # 显式指定编码,可选加errors='ignore'忽略无法解码的异常字符 with open('passwordlist.txt', 'r', encoding='utf-8') as file: count = 1 # 直接迭代文件对象,空行也会正常遍历不会中断 for line in file: line = line.rstrip() print(f'Trying password {count} -> {line}') count += 1 result = test_hash(target_hash, line) if result == 1: break
内容的提问来源于stack exchange,提问作者laelaps
相关产品推荐
相关产品推荐

