PHP Manual
/
安全问题

如何破解md5函数

23. 08. 2019

Obsah článku

MD5是一个非常常用的计算哈希值的函数。

初学者经常将其用于密码散列,这并不是一个好主意,因为有许多方法可以检索到原始密码。

本文介绍了这样做的具体方法。

时间的复杂性

所有的安全都是建立在尝试所有密码所需的时间过长这一事实之上。嗯,应该这样。特别是md5()算法的问题是,它是一个非常快的函数。在一台正常的计算机上,每秒计算超过一百万个哈希值是没有问题的。

如果我们通过逐一尝试组合来破解密码,这就是**的暴力攻击。

裂解方法

有几种策略。

  • 顺序试错(蛮力攻击)。
  • 测试字典密码
  • 彩虹表(预先计算的哈希数据库)。
  • 谷歌搜索
  • 打击算法中的碰撞

还有很多方法,本文只介绍最常见的方法。

蛮力破解策略

所有字母、数字和其他字符的组合都会被逐一尝试。

生成的尝试被逐一散列并与原始散列进行比较。

因此,举例来说。

aaaaaaabaaacaaadaaaeaaaf...

这种攻击的问题在于md5()算法本身,如果我们只尝试英文字母和数字的小写字母,在一台常见的计算机上尝试所有的组合最多需要数十分钟。

因此,选择长密码是很重要的,最好是带有特殊字符的随机密码。

词典攻击策略

人们通常选择字典中存在的弱密码。

如果我们利用这一事实,我们可以迅速抛弃不太可能的变体,如6w1SCq5cs,而是猜测现有的词。

此外,我们从以前大公司的密码泄露事件中得知,用户在密码的开头选择一个大写字母,在结尾选择一个数字。让我们看看--你的密码也有这个功能吗?:)

彩虹表--预先计算的数据库

由于一个密码总是对应于同一个哈希值,所以很容易重新计算一个巨大的数据库,在其中首先搜索密码。

事实上,搜索总是比一遍又一遍地搜索哈希值快几个数量级。

此外,对于较大的数据泄漏,可以通过这种方式对密码进行并行哈希,例如,可以快速检索出所有用户密码的10%。

一个好的密码数据库是例如裂缝站

谷歌搜索

许多简单的密码直接被谷歌知道,因为它对包含哈希值的网页进行索引。

我总是把谷歌作为我的第一选择。:)

寻找算法中的碰撞

Dirichlet原则描述了如果我们有一组总是32个字符的哈希值,那么至少有2个长度为33个字符的不同密码(一个更长)可以生成相同的哈希值。

在实践中,寻找碰撞是没有意义的,但有时应用程序的作者自己通过重新计算碰撞使猜测变得更容易。

比如说。

$password = '密码';
for ($i = 0; $i <= 1000; $i++) {
$password = md5($password);
}
echo $password; //通过md5()进行1000倍散列

在这种情况下,猜测碰撞而不是原始哈希值是有意义的。

为浇水干杯!

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
3.
Status:
All systems normal.
2024