代码之家  ›  专栏  ›  技术社区  ›  Alex

md5多线程brueforce

  •  3
  • Alex  · 技术社区  · 12 年前

    我使用python 2.7,我有一个简单的多线程md5 dict暴力:

    # -*- 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个在每个线程中暴力处理哈希的线程。诸如此类的事情。

    我该怎么做?

    附言:很抱歉我的解释,如果你不明白我想要什么。

    附言:这不是粗暴对待md5,而是多线程。

    谢谢

    2 回复  |  直到 12 年前
        1
  •  4
  •   Adam Rosenfield    12 年前

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

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

        2
  •  1
  •   Noctis Skytower    12 年前

    我相信以下代码将是一个比您的示例代码效率高得多的程序:

    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()
    

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