【问题标题】:Python Memory Errors with ItertoolItertool 的 Python 内存错误
【发布时间】:2019-06-14 05:41:28
【问题描述】:

我有一个小型 Bruteforce 程序要为学校做。 我做了一个程序,但是当我运行我的代码时,出现了内存错误...... 这是来自我的 IDE 的消息:

passwords = [''.join(word) for itertools.product(Alphabet, repeat=CharLength)] 内存错误

我想大多数错误是由于我如何使用 loop no 造成的? 作为一个菜鸟,我从来没有遇到过这种类型的错误......我再给你 1 条信息,我正在 Windows 上运行我的代码

如何优化我的代码以及如何修复? 这是我的代码:

import hashlib
import itertools


#possible characters in user password
Alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.;#@")
#minimum password value
CharLength = 6

#getting passwords and username from shadow file
with open("shadow_test", "r") as ins:
    array = []
    users = []
    passwd = []
    #getting everyline from shadow file into an array
    for line in ins:
        array.append(line)
    #saving only username and passwords
    for pw in array:
        str(pw)
        r= pw.split(":")
        users.append(r[0])
        passwd.append(r[1])

    list = []
    #removing passowrd with * or !
    for mdp in passwd:
        if mdp != '*' and mdp != '!':
            str(mdp)
            list.append(mdp)
            # trying to Bruteforce
            for _ in range(12):
                passwords = [''.join(word) for word in itertools.product(Alphabet, repeat=CharLength)]

                print(*passwords)
                for pswd in passwords:
                    hash_object = hashlib.md5(str.encode(pswd)).hexdigest()
                    # hash_object.update(*passwords.encode('utf-8'))
                    generatedpassword = '$1$' + hash_object

                    for compare in list:
                        for user in users:
                            #print('on cherche le Mot de passe : ' + compare +' pour ' +user)
                            #print('mot de passe MD5 généré : ' +generatedpassword)
                            #print('mot de passe clair généré : ' +pswd)


                            if generatedpassword == list:
                                print('Le Mot de passe pour' + user + ' est : ' + compare)

【问题讨论】:

    标签: python-3.x performance memory optimization itertools


    【解决方案1】:

    password 列表原样将有大约 1000 亿个条目,因此您需要超过 1 TB 的内存才能容纳它。与其将其设为列表,不如将其作为生成器稍后循环:

    passwords = (''.join(word) for word in itertools.product(Alphabet, repeat=CharLength))
    

    (虽然有 1000 亿个条目,但您可能会等待一段时间。)

    【讨论】:

      【解决方案2】:
      passwords = [''.join(word) for word in itertools.product(Alphabet, repeat=CharLength)]
      

      在这里,您正在创建一个长度超过 50**6 的列表。当然你会得到一个内存错误。改用生成器:

      passwords = (''.join(word) for word in itertools.product(Alphabet, repeat=CharLength))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 2013-12-04
        • 2012-10-31
        • 2011-05-18
        • 1970-01-01
        • 2019-11-16
        相关资源
        最近更新 更多