如何在哈希密码匹配搜索后保留CSV数据顺序并实现指定明文查找功能?
如何在哈希密码匹配搜索后保留CSV数据顺序并实现指定明文查找功能?
看起来你正在做一个针对SHA256哈希的暴力破解小工具,目标是从0000到9999的数字里找出能匹配CSV中密码哈希的明文,还希望能保留CSV里的原始数据顺序对吧?我先帮你梳理下需求,再看看怎么优化代码,让它更高效还能满足顺序要求~
首先明确你的核心需求:
- 读取包含「用户名」和「SHA256哈希密码」的CSV文件
- 生成0000到9999所有数字的SHA256哈希(数字要补前导零成4位格式)
- 将每个数字的哈希与CSV中的密码哈希逐一比对
- 匹配成功时,输出对应的明文数字,同时能对应到CSV里的原始记录
先说说你现有代码可以优化的点
你的代码逻辑是对的,但有两个小问题:一是嵌套循环效率偏低(尤其是CSV数据多的时候),二是字典的键用编码后的字符串有点冗余。另外如果要保留CSV的原始顺序,最好能记录每一行的位置信息。
优化方案一:高效匹配+保留原始顺序(推荐)
这个方案先把CSV里的哈希映射到对应的用户信息和行号,再去生成数字哈希做匹配,既高效又能明确对应到CSV的原始位置:
import csv import hashlib # 1. 读取CSV,构建哈希到用户信息的映射,同时记录行号(保留原始顺序) hash_user_map = {} with open("passwords.csv", newline="") as csv_file: reader = csv.reader(csv_file) # 如果CSV有表头,先跳过;没有的话就注释掉下面这行 header = next(reader) # 用enumerate记录行号,从1开始更符合日常阅读习惯 for row_num, (name, pwd_hash) in enumerate(reader, start=1): # 处理同一个哈希对应多个用户的情况 if pwd_hash not in hash_user_map: hash_user_map[pwd_hash] = [] hash_user_map[pwd_hash].append({"行号": row_num, "用户名": name}) # 2. 遍历0000-9999生成哈希,匹配并输出结果 for num in range(10000): # 格式化数字为4位带前导零的字符串 plaintext = f"{num:04d}" # 计算SHA256哈希 current_hash = hashlib.sha256(plaintext.encode()).hexdigest() # 检查是否匹配 if current_hash in hash_user_map: print(f"找到匹配:明文密码是 {plaintext},对应CSV中的记录:") for user_info in hash_user_map[current_hash]: print(f" 第{user_info['行号']}行 - 用户名:{user_info['用户名']}")
优化方案二:严格按CSV顺序逐一比对(贴近你的原始逻辑)
如果你更倾向于保持原始的“遍历数字→逐个比对CSV行”的逻辑,也可以调整成下面这样,确保完全按照CSV的原始顺序去匹配,同时输出对应的行号:
import csv import hashlib # 1. 读取CSV并保留原始顺序 csv_data = [] with open("passwords.csv", newline="") as csv_file: reader = csv.reader(csv_file) # 跳过表头(如果没有表头就注释) next(reader) for row in reader: csv_data.append(row) print("\nCSV原始数据:", csv_data, "\n") # 2. 遍历数字并按CSV顺序比对 for num in range(10000): plaintext = f"{num:04d}" current_hash = hashlib.sha256(plaintext.encode()).hexdigest() # 按CSV的原始顺序逐一检查每一行 for row_num, (name, pwd_hash) in enumerate(csv_data, start=1): if pwd_hash == current_hash: print(f"在CSV第{row_num}行找到匹配:用户名 {name},明文密码是 {plaintext}")
注意事项
- 别忘了导入
csv和hashlib模块,你的原始代码里没写,运行时会报错 - 如果CSV没有表头,记得把代码里跳过表头的
next(reader)注释掉 - 两种方案都能完美保留CSV的原始顺序,第一种效率更高,适合数据量较大的情况;第二种逻辑更直观,贴近你的初始思路
备注:内容来源于stack exchange,提问作者HaoShoku
相关产品推荐
相关产品推荐

