MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,用于生成数据的128位哈希值。尽管 MD5 已被认为不再安全,但它仍然在某些场景中使用。编写一个 MD5 破解程序通常涉及暴力破解(brute force)或字典攻击(dictionary attack)。
以下是一个简单的 Python MD5 破解程序的示例,使用暴力破解方法。我们将对其进行一些改进,以提高效率和可读性。
首先,让我们看看一个基本的 MD5 破解程序:
import hashlib
import itertools
import string
def md5_hash(text):
return hashlib.md5(text.encode()).hexdigest()
def brute_force_md5(target_hash, max_length):
chars = string.ascii_lowercase + string.digits
for length in range(1, max_length + 1):
for guess in itertools.product(chars, repeat=length):
guess = ''.join(guess)
if md5_hash(guess) == target_hash:
return guess
return None
if __name__ == "__main__":
target_hash = "5d41402abc4b2a76b9719d911017c592" # "hello" 的 MD5 哈希值
max_length = 5
result = brute_force_md5(target_hash, max_length)
if result:
print(f"Found: {result}")
else:
print("Not found")
我们可以对上述程序进行一些改进,以提高效率和可读性:
以下是改进后的程序:
import hashlib
import itertools
import string
import threading
from queue import Queue
def md5_hash(text):
return hashlib.md5(text.encode()).hexdigest()
def worker(target_hash, max_length, queue, result):
while not queue.empty():
guess = queue.get()
if md5_hash(guess) == target_hash:
result.append(guess)
break
queue.task_done()
def brute_force_md5(target_hash, max_length, num_threads=4):
chars = string.ascii_lowercase + string.digits
queue = Queue()
result = []
# 将所有可能的组合放入队列
for length in range(1, max_length + 1):
for guess in itertools.product(chars, repeat=length):
queue.put(''.join(guess))
# 创建并启动线程
threads = []
for _ in range(num_threads):
thread = threading.Thread(target=worker, args=(target_hash, max_length, queue, result))
thread.start()
threads.append(thread)
# 等待所有任务完成
queue.join()
# 等待所有线程完成
for thread in threads:
thread.join()
return result[0] if result else None
if __name__ == "__main__":
target_hash = "5d41402abc4b2a76b9719d911017c592" # "hello" 的 MD5 哈希值
max_length = 5
num_threads = 8
result = brute_force_md5(target_hash, max_length, num_threads)
if result:
print(f"Found: {result}")
else:
print("Not found")
threading
模块创建多个线程,每个线程从队列中取出一个猜测并计算其 MD5 哈希值。这样可以并行处理多个猜测,提高破解速度。tqdm
库来显示进度条。例如,在将猜测放入队列时,可以使用 tqdm
包装迭代器。chars
变量中的字符集。例如,如果你知道密码只包含小写字母和数字,可以使用 string.ascii_lowercase + string.digits
。如果密码可能包含大写字母或特殊字符,可以相应地扩展字符集。领取专属 10元无门槛券
手把手带您无忧上云