取消散列 (MD5) 电子邮件地址

Unhashing a hashed (MD5) email address

我知道,根据定义,在对您进行哈希处理时,您会丢失信息。但是,由于可以限制电子邮件地址 - 例如根据可用信息,我会知道电子邮件的潜在域,并且它必须有一个 @。这些约束是否改变了问题的任何内容?或者是简单地猜测并查看哈希值是否相同的最佳方法?此外,MD5 不再像以前那样安全。

谢谢

这就是 Md5 散列的要点,即使字符串中的微小变化也会完全改变散列。所以这些限制对问题没有任何改变。

不过,既然你说这是一封电子邮件,而且你知道潜在的域名,那么你可以试试这个技巧。

  1. 生成 26 个字母以内的潜在电子邮件列表,假设最大大小为 10。

然后您可以为所有这些可能性生成一个 md5 并检查它是否等于您拥有的那个。

import hashlib
from itertools import combinations
import time

start=time.time()
your_md5_hash='your_md5_hash'
letters='abcdefghijklmnopqrstuvwxyz'
possible_words=[]
for r in range(1,10): #change 10 to the maximum size of your email
    for combo in combinations(list(letters), r=r):
        res=''.join(combo)
        possible_words.append(res)


possible_words=[''.join(x)+'@domain.com' for x in possible_words]
print (len(possible_words))
for x in possible_words:
    res=hashlib.md5(x.encode())
    if res==your_md5_hash:
        print (res)
        print (x)
        print ("RESULT_FOUND")
        exit(0)

print (time.time()-start)

这是一种蛮力方法,如果您知道您的电子邮件的大小,那么这可能会奏效。其次请注意,如果您不知道大小,那么可能性的大小将成倍增加。

例如,目前的组合长度是 5658536,我的基本笔记本电脑需要 6 秒才能处理。