是否可以解密MD5哈希?

2024-04-25 09:35:55 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

不,MD5不是加密(尽管它可以作为某些加密算法的一部分使用),它是单向的hash function。作为转换的一部分,许多原始数据实际上是“丢失”的。

想想看:MD5总是128位长。这意味着有2个128可能的MD5散列。这是一个相当大的数字,但它绝对是有限的。然而,对于给定的散列函数,可能有无限多的输入(其中大多数包含超过128位,或者只有16个字节)。因此,实际上有无限多的可能,数据将哈希到相同的值。使散列有趣的是,很难找到两个散列到相同值的数据片段,而且意外发生的几率几乎为0。

对于(非常不安全的)散列函数(这说明了它是单向的一般概念),一个简单的例子是获取一段数据的所有位,并将其视为一个大数。接下来,使用一些大(可能是素数)数进行整数除法,并取余数(请参见:Modulus)。您将留下0到n之间的数字。如果您要使用完全相同的字符串再次执行相同的计算(任何时间、任何计算机、任何位置),它将得到相同的值。然而,没有办法找出原始值是什么,因为当除以n时,有无限多的数字具有确切的余数。

也就是说,MD5已经被发现有一些弱点,例如,在一些复杂的数学中,不尝试2128可能的输入字符串就可能找到冲突。事实上,大多数密码都很短,人们经常使用普通值(如“password”或“secret”),这意味着在某些情况下,你可以通过搜索散列或使用Rainbow table对某人的密码进行合理的猜测。这就是为什么您应该始终使用“salt”哈希密码,以便两个相同的值在哈希时不会哈希到相同的值的原因之一。

一旦一段数据通过散列函数运行,就没有回头路了。

理论上你不能。散列的全部意义在于它只是一种方式。这意味着,如果有人设法获得散列列表,他们仍然无法获得您的密码。另外,这意味着即使有人在多个站点上使用相同的密码(是的,我们都知道我们不应该这样做,但是…),任何可以访问站点A数据库的人都不能在站点B上使用用户的密码

MD5是一个散列也意味着它会丢失信息。对于任何给定的MD5散列,如果允许任意长度的密码,则可能有多个密码产生相同的散列。对于一个好的散列,在计算上不可能找到超过非常小的最大长度的密码,但这意味着没有保证如果找到一个具有目标散列的密码,它肯定是原始密码。从天文角度来看,你不太可能看到两个只有ASCII的、长度合理的密码,它们有相同的MD5散列,但这并非不可能。

MD5是用于密码的错误哈希:

  • 它很快,这意味着如果你有一个“目标”散列,它是便宜的尝试许多密码,看看你是否可以找到一个散列到那个目标。Salting对这种场景没有帮助,但它有助于使使用不同的salts查找匹配多个散列中任何一个的密码变得更昂贵。
  • 我相信它已经知道了一些缺陷,这些缺陷使得查找冲突变得更容易,尽管在可打印文本(而不是任意的二进制数据)中查找冲突至少会更困难。

我不是安全专家,所以除了“不要使用自己的身份验证系统”之外,我不会给出具体的建议。从一个信誉良好的供应商那里找到一个,然后使用它。安全系统的设计和实现都是一项棘手的工作。

从技术上讲,这是“可能的”,但在非常严格的条件下(rainbow tables,基于用户密码在散列数据库中的可能性非常小的暴力强制)。

但这并不意味着

  • 可行
    或者
  • 安全

您不想“反转”一个MD5哈希。使用下面列出的方法,您永远不需要这样做逆转“MD5”实际上被认为是恶意的-一些网站提供了“破解”和强制执行MD5哈希的能力-但它们都是包含字典单词、以前提交的密码和其他单词的海量数据库。有一个很小的机会,它将有MD5哈希你需要逆转。如果你有saltedMD5哈希-这也行不通!:)


使用MD5散列登录的工作方式是:

注册期间:
用户创建密码->;密码使用存储在数据库中的MD5->;哈希进行哈希运算

登录时:
用户输入用户名和密码->;(用户名已选中)使用MD5对密码进行散列->;将散列与数据库中存储的散列进行比较

需要“丢失密码”时:

2个选项:

  • 用户发送了一个随机密码以登录,然后在首次登录时被窃听以更改它。


  • 向用户发送一个更改其密码的链接(如果您有安全问题,请进行额外检查/etc),然后对新密码进行哈希运算,并用数据库中的旧密码替换

相关问题 更多 >