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

如何提升嵌套循环中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:23:20