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:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | zh