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

如何在哈希密码匹配搜索后保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 14:28:14