Python中是否有MD5解密函数?

7

可能重复:
是否可以解密md5哈希值?

我使用了 md5.new(); md5.update("aaa"), md5.digest()

来形成数据 "aaa" 的 md5 哈希值。如何使用 Python 获取原始数据?


13
不行,在Python或任何其他编程语言中都不行。 - OscarRyz
7
md5()不是一个“加密”函数。它没有反函数,如果有的话,它就不能用于密码。 - rook
9
数据 -> 哈希 = 牛排 -> 汉堡 - Paul Sasik
3
@Paul Sasik:更像是从牛到牛排,试着反过来做这个操作 ;) - Wolph
1
不要相信那些批评者。MD5 已经如此有缺陷,以至于你可以使用碰撞攻击来解决反向问题,这种攻击可以在配备 2.6 GHz Pentium 4 处理器的计算机上在几秒钟内找到碰撞(复杂度为 224.1)。原始代码需要彩虹表,但你可以很快地找到其他字符串,它们将散列成相同的东西。这就是为什么它已经被弃用了。https://zh.wikipedia.org/wiki/MD5#%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98 - Tatarize
7个回答

22

您无法解码MD5哈希值,因为哈希是一种最好被看作单向编码的过程(也就是说,被哈希的内容无法被还原;只能通过检查已知哈希列表或者对一组输入进行哈希并将生成的哈希与您要“解码”的哈希进行匹配来确定被哈希的内容)。

引用维基百科,这种哈希算法的关键特征包括:

找到一个给定哈希值的消息是不可行的,

修改消息而不改变其哈希值是不可行的,

找到两个具有相同哈希值的不同消息是不可行的。

现在这种算法最常见的用途是:

  • 存储密码
  • 验证文件内容。

如果您想要双向加密数据,您需要查看Python的其他加密库(通常情况下,Stackoverflow会有建议)。


如果它不是用于“解码”,那么“编码”是一个相当糟糕的选择。为什么不使用传统的“单向哈希”呢? - tzot
@ΤΖΩΤΖΙΟΥ:因为单向编码/加密是一个错误的术语,只被那些不完全确定自己在谈论什么的人使用。 - BlueRaja - Danny Pflughoeft
每天都有密码哈希被破解。 - rook
1
我曾经这样说过:“哈希函数就像制作绞肉一样:你无法将其变回成牛。” - Thomas
"哈希函数"这个术语实际上来自烹饪。 - Base64__

14

你无法做到这一点。这就是关键——哈希是单向的,它不同于加密。


2
哈希不一定是单向的,但MD5确实是。;) 只有在存在碰撞的情况下,哈希才是单向的,这意味着任何两个不同的输入具有相同的结果。 - Nathan Ernst
2
@Nathan:那根本没有任何意义。 - BlueRaja - Danny Pflughoeft
能否详细说明一下为什么它不合理?如果你从数学角度来看,哈希只是一个函数h(x)=y,其中h是哈希函数,x是输入,y是输出。只有当存在任何这样的xz,使得h(x)=y 并且 h(z)=y,假设x != z,哈希才是单向的。假设h(x)只是一个标识符(比如说x是整数或字符类型),甚至只是一个简单的旋转。这将完全可逆,因此不是单向的。 - Nathan Ernst
1
@Nathan:你把单向的数学定义和单向的计算定义混淆了。如果我们使用你的定义,那么每个具有固定输出大小的函数都将是哈希函数(这在一般的"哈希"中技术上是正确的,但在我们讨论的密码哈希函数中则不是)。 - BlueRaja - Danny Pflughoeft

3
我不知道Python,但哈希函数是不可逆的。首先,请注意哈希函数提供恒定长度的输出 - 这意味着信息将被丢弃(您可以对3 MB的文件进行哈希,但仍然只能得到不到1 kB的结果)。此外,哈希函数是为了它们不可逆转而设计的,如果您需要加密,请不要使用哈希而是使用加密 - 哈希的主要应用之一是当数据库信息泄漏(其中包含哈希)时密码没有被破解(还有更多例子,但这是最明显的一个)。

这仅适用于加密哈希函数。纯数学哈希函数没有固有的大小,哈希(n) = n % 101,即使大多数实现都会有一个类型大小相关联。这是将值映射到数组索引的常见方法,即使它是不可逆的(除非您知道n <101),但很容易预测可能的输入。 - mikerobi

3
如果你想破解哈希值,例如密码哈希值,那么你需要一个非常大的查找表。John the Ripper通常用于使用字典破解密码,这是一种非常好的方法,尤其是对于加盐的密码哈希值。
另一种方法是使用Rainbow Table,但是生成这些需要很长时间。有在线免费可访问的彩虹表这里有一个Python脚本执行md5()暴力攻击。

1

除了其他人的观点,MD5是一种单向哈希。通常用法是对两个输入值进行哈希,如果哈希值匹配,则输入应该是相同的。从MD5哈希值到哈希输入的转换是没有意义的。你可能需要的是对称加密算法 - 可以参考双向密钥加密/哈希算法来进行讨论。


"MD5是单向哈希函数。" - Jasper
@Jasper - MD5是一种单向哈希函数,这使其成为候选_密码_哈希函数,你所说的双向_密码_哈希函数是完全无意义的。我想我应该说“MD5是一种密码哈希函数,因此本质上是不可逆的”。 - D.Shawley
1
@Jasper:我看到你的苛求,然后提出:完美哈希。所有合法输入都映射到一个不同的输出,因此可以被反转,所以是一种双向哈希函数。 - Jason

0
一般来说,BlueRaja和Sean的答案是正确的。MD5(以及其他哈希函数)是单向的,你无法反转这个过程。
然而,如果你有一个小数据量,你可以尝试搜索哈希碰撞(另一个或相同的数据片段),使其具有相同的哈希值。

碰撞搜索非常耗时,我认为你的意思是字典攻击。 - rook
是的,使用字典攻击来查找数据的碰撞位会快得多(最终,这是哈希中的碰撞)。 - ssube

0

哈希将一堆数据映射到有限(虽然很大)的一组数字值/字符串。

它是多对一映射,因此在密码学意义上不仅“困难”,而且在概念上不可能解码哈希,即使您可以,您也会得到无限的可能输入字符串集合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接