3

我使用 python 2.7,我有一个简单的多头 md5 dict brute:

# -*- coding: utf-8 -*-

import md5
import Queue
import threading
import traceback

md5_queue = Queue.Queue()


def Worker(queue):
    while True:
        try:
            item = md5_queue.get_nowait()
        except Queue.Empty:
            break
        try:
            work(item)
        except Exception:
            traceback.print_exc()

        queue.task_done()


def work(param):
    with open('pwds', 'r') as f:
        pwds = [x.strip() for x in f.readlines()]

    for pwd in pwds:
        if md5.new(pwd).hexdigest() == param:
            print '%s:%s' % (pwd, md5.new(pwd).hexdigest())


def main():
    global md5_queue
    md5_lst = []
    threads = 5

    with open('md5', "r") as f:
        md5_lst = [x.strip() for x in f.readlines()]

    for m in md5_lst:
        md5_queue.put(m)    # add md5 hash to queue

    for i in xrange(threads):
        t = threading.Thread(target=Worker, args=(md5_queue,))
        t.start()

    md5_queue.join()


if __name__ == '__main__':
    main()

在 5 个线程中工作。每个线程从队列中读取一个哈希值并使用密码列表进行检查。非常简单:1 个线程 1 签入“for”循环。

我想要更多一点:1 个线程和几个线程来检查密码。所以 work() 应该从队列中读取哈希并启动新数量的线程来检查密码(1 个线程哈希,10 个线程在那里检查密码)。例如:20 个带哈希的线程和 20 个线程在每个线程中对哈希进行暴力破解。类似的东西。

我怎样才能做到这一点?

PS对不起我的解释,问你是否不明白我想要什么。

PPS 这不是关于暴力 md5,而是关于多线程。

谢谢。

4

2 回答 2

4

Python 的默认实现(称为 CPython)使用全局解释器锁(GIL),它实际上只允许一个线程同时运行。对于 I/O 绑定的多线程应用程序,这通常不是问题,但对于像您这样受 CPU 限制的应用程序,这意味着您不会看到太多的多核加速。

我建议使用没有 GIL 的不同 Python 实现,例如 Jython,或者重写代码以使用没有 GIL 的不同语言。用本机编译的代码编写它是一个好主意,但是大多数具有 MD5 函数的脚本语言通常无论如何都会在本机代码中实现它,所以老实说,我不希望在本机编译的语言和脚本语言之间有太多的加速。

于 2012-08-02T18:40:38.480 回答
1

我相信以下代码将是一个比您的示例代码更有效的程序:

from __future__ import with_statement

try:
    import md5
    digest = lambda text: md5.new(text).hexdigest()
except ImportError:
    import hashlib
    digest = lambda text: hashlib.md5(text.encode()).hexdigest()

def main():
    passwords = load_passwords('pwds')
    check_hashes('md5', passwords)

def load_passwords(filename):
    passwords = {}
    with open(filename) as file:
        for word in (line.strip() for line in file):
            passwords.setdefault(digest(word), []).append(word)
    return passwords

def check_hashes(filename, passwords):
    with open(filename) as file:
        for code in (line.strip() for line in file):
            for word in passwords.get(code, ()):
                print (word + ':' + code)

if __name__ == '__main__':
    main()

它是用 Python 2.x 和 3.x 编写的,应该能够在其中任何一种语言上运行。

于 2012-08-02T20:57:01.713 回答