如何提升嵌套循环中200万次Login()函数调用的执行效率?
暴力破解登录程序优化方案
问题背景
网络安全课程作业需求:遍历gang.txt(共20行,需跳过Adam和Donald)中的用户名,以及PwnedPWs100k.txt(10万行)中的密码,将每对组合传入Login.py中的Login()函数,直到找到正确的登录凭证。现有代码通过修改sys.argv传递参数,预计180万次函数调用耗时超50小时,需要优化执行效率,同时保留打印程序起止时间的要求。
现有代码核心问题
每次调用Login()前手动修改全局sys.argv列表,这种操作存在额外系统开销,且逻辑冗余——完全可以通过直接传参替代全局变量操作,这是效率低下的主要原因。
优化方案
1. 让Login()直接接收参数(优先推荐)
如果有权限修改Login.py,直接重构Login()函数,让它接受用户名和密码作为参数,彻底抛弃依赖sys.argv的逻辑:
# 修改Login.py中的Login函数 def Login(username, password): # 原逻辑替换为使用传入的username和password,不再读取sys.argv # 示例验证逻辑: if username == "valid_user" and password == "valid_pw": return True return False
调用时直接传参,避免全局变量的修改与读取开销,效率会大幅提升。
2. 无法修改Login.py时,封装包装函数
如果不能修改原Login.py,写一个包装函数统一处理sys.argv的赋值:
def login_wrapper(username, password): sys.argv = [sys.argv[0], username, password] return Login.Login()
调用时直接用login_wrapper(name, password),避免原代码中重复的sys.argv赋值操作。
3. 逐行读取密码文件,减少内存占用
原代码把整个密码文件加载到列表中,改成逐行读取,边读边遍历,既节省内存,也避免一次性IO的额外开销:
with open("PwnedPWs100k.txt") as pws: for password in pws: password = password.strip() # 调用登录验证函数
4. 找到正确凭证后立即终止所有遍历
原代码找到正确密码后仅终止当前密码循环,还会继续遍历下一个用户——找到正确组合后直接退出程序,避免不必要的后续操作:
if login_wrapper(name, password): print(f"USER: {name} PASSWORD: {password}") sys.exit() # 直接退出,不再继续遍历
优化后完整代码(无法修改Login.py的情况)
import Login import datetime import sys if __name__ == "__main__": print("程序开始时间:", datetime.datetime.utcnow()) # 读取并过滤用户名 with open("gang.txt") as gang: gang_names = [name.strip() for name in gang if name.strip() not in ('Adam', 'Donald')] # 定义登录包装函数 def login_wrapper(username, password): sys.argv = [sys.argv[0], username, password] return Login.Login() # 遍历用户名+逐行读取密码验证 for name in gang_names: with open("PwnedPWs100k.txt") as pws: for password in pws: password = password.strip() if login_wrapper(name, password): print(f"USER: {name} PASSWORD: {password}") print("程序结束时间:", datetime.datetime.utcnow()) sys.exit() print("程序结束时间:", datetime.datetime.utcnow())
额外优化建议
- 多进程并行处理:用
multiprocessing模块把用户名分配给不同进程,同时遍历密码,利用CPU多核资源进一步缩短时间,比如每个进程处理1-2个用户名。 - 预过滤无效密码:如果知道目标系统的密码规则(比如长度、字符类型),先过滤不符合规则的密码,减少无效调用次数。
内容的提问来源于stack exchange,提问作者jdash
相关产品推荐
相关产品推荐

