如何用Python计算文件MD5哈希并与txt导入的恶意哈希值比对
Python MD5哈希校验脚本实现
需求说明
计算指定目录下所有文件的MD5哈希值,与malicious_hash.txt文件内存储的哈希值比对,匹配时打印MATCH FOUND提示。
现有代码问题梳理
- 恶意哈希文件读取使用二进制模式,得到的bytes类型无法直接和字符串格式的MD5值匹配,且没有处理每行的换行符、空白字符
- 计算文件MD5的函数参数名拼写错误,路径判断逻辑正常但缺少哈希比对步骤
- MD5值打印语句存在语法错误
修正后完整可运行代码
import os import hashlib # 配置参数 MALICIOUS_HASH_PATH = "C:/Users/user/Downloads/malicious_hash.txt" SCAN_FOLDER = "C:/Users/user/Downloads" # 预加载恶意哈希集合,提升比对效率 malicious_hash_set = set() with open(MALICIOUS_HASH_PATH, 'r', encoding='utf-8') as f: for line in f: # 去除每行的换行符、首尾空白,跳过空行 cleaned_hash = line.strip().lower() if cleaned_hash: malicious_hash_set.add(cleaned_hash) def cal_file_md5(file_path): """计算单个文件的MD5哈希值""" with open(file_path, "rb") as f: file_hash = hashlib.md5() # 分块读取大文件,避免内存溢出 while chunk := f.read(1024 * 1024): file_hash.update(chunk) return file_hash.hexdigest().lower() def cal_folder_hash(folder): """递归遍历目录计算所有文件MD5并比对恶意哈希""" if not os.path.exists(folder): print(f"文件夹不存在: {folder}") return for file in os.listdir(folder): path = os.path.join(folder, file) if os.path.isdir(path): # 递归遍历子目录 cal_folder_hash(path) else: print(f"当前扫描文件: {path}") current_md5 = cal_file_md5(path) print(f"MD5值: {current_md5}") # 哈希比对逻辑 if current_md5 in malicious_hash_set: print("*MATCH FOUND*") if __name__ == "__main__": cal_folder_hash(SCAN_FOLDER)
优化说明
- 将恶意哈希存入集合,比对时间复杂度从O(n)降到O(1),哈希数量多的时候效率提升明显
- 统一将哈希值转为小写,避免大小写不一致导致的匹配失败
- 增加空行跳过逻辑,适配malicious_hash.txt里存在空行的场景
- 增加
if __name__ == "__main__"判断,避免脚本被导入时自动执行扫描逻辑
内容的提问来源于stack exchange,提问作者Jamysim
相关产品推荐
相关产品推荐

