我看到有人用 MD5 对用户密码进行多次加密以提高安全性。我不确定这是否有效,但看起来不太好。那么,这有意义吗?
我们假设您使用的哈希函数是一个完美的单向函数。然后你可以像查看它的输出一样查看它的输出“随机神谕”,其输出值在有限的值范围内(MD5 为 2^128)。
现在,如果多次应用哈希会发生什么?输出仍将保持在相同范围内 (2^128)。就像你说“猜猜我的随机数!”二十次,每次都想一个新的数字——这并不会让猜测变得更难或更容易。没有比随机更“随机”的了。这不是一个完美的类比,但我认为它有助于说明问题。
考虑到暴力破解密码,您的方案根本不会增加任何安全性。更糟糕的是,您唯一可以“完成”的事情就是通过引入一些利用哈希函数重复应用的可能性来削弱安全性。虽然可能性不大,但至少可以保证你不会赢得任何东西。
那么为什么这种方法仍然没有迷失呢?这是因为其他人提出的想法是进行数千次迭代,而不是仅仅 20 次。为什么这是一件好事,可以减慢算法速度?这是因为大多数攻击者会尝试使用字典(或彩虹桌使用常用的密码,希望你的一个用户粗心大意地使用其中之一(我有罪,至少 Ubuntu 在安装时告诉我)。但另一方面,要求用户记住 30 个随机字符是不人道的。
这就是为什么我们需要在易于记住的密码和同时使攻击者尽可能难以猜测密码之间进行某种形式的权衡。有两种常见的做法,salts并通过对某些函数应用大量迭代而不是单次迭代来减慢进程。PKCS#5是一个值得研究的好例子。
在您的情况下,应用 MD5 20000 而不是 20 次会显着降低攻击者使用字典的速度,因为他们的每个输入密码都必须经过哈希 20000 次的普通过程才能仍然作为攻击有用。请注意,此过程不会not影响暴力破解,如上所示。
但为什么使用盐更好呢?因为即使您应用哈希 20000 次,足智多谋的攻击者也可以预先计算大型密码数据库,对每个密码进行哈希 20000 次,从而有效地生成专门针对您的应用程序的自定义彩虹表。完成此操作后,他们可以很容易地攻击您的应用程序或使用您的方案的任何其他应用程序。这就是为什么您还需要为每个密码生成较高的成本,以使此类彩虹表使用起来不切实际。
如果您想真正安全,请使用 PKCS#5 中所示的 PBKDF2 之类的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)