我看到有人用MD5多次加密用户密码以提高安全性。我不确定这是否有效,但看起来并不好。那么,它有意义吗?
答案 0 :(得分:4)
让我们假设你使用的哈希函数是一个完美的单向函数。然后您可以像"random oracle"那样查看其输出,其输出值在有限的值范围内(MD5为2 ^ 128)。
现在如果多次应用哈希会发生什么?输出仍将保持在相同范围内(2 ^ 128)。这就像你说“猜猜我的随机数!”二十次,每次都想到一个新的数字 - 这不会让你更难或更容易猜到。没有任何“随机”比随机。这不是一个完美的类比,但我认为这有助于说明问题。
考虑到暴力破解密码,您的方案根本不会增加任何安全性。更糟糕的是,你唯一可以“完成”的是通过引入一些利用哈希函数重复应用的可能性来削弱安全性。这不太可能,但至少保证你肯定不会赢得任何东西。
那么为什么这种方法仍然没有全部丢失?这是因为其他人认为有数千次迭代而不是只有二十次迭代。为什么这是一件好事,减慢算法速度?这是因为大多数攻击者会尝试使用字典(或rainbow table使用经常使用的密码来获取访问权限,希望你的一个用户过于疏忽使用其中一个(我很有罪,至少Ubuntu告诉我安装时。)另一方面,要求用户记住30个随机字符是不人道的。
这就是为什么我们需要在易于记忆的密码之间进行某种形式的权衡,但同时要让攻击者尽可能地猜测它们。有两种常见的做法,salts并通过应用一些函数的大量迭代而不是单次迭代来减慢进程。 PKCS#5是一个很好的例子。
在你的情况下,使用MD5 20000代替20次会减慢使用字典显着降低的攻击者,因为他们的每个输入密码都必须经过20000次哈希的普通程序才能作为攻击仍然有用。请注意,此过程不影响强制强制,如上所示。
但为什么使用盐仍然更好?因为即使您应用了20000次哈希,资源丰富的攻击者也可以预先计算一个大型密码数据库,每次密码扫描20000次,有效地生成专门针对您的应用程序的自定义彩虹表。完成此操作后,他们很容易使用您的方案攻击您的应用程序或任何其他应用程序。这就是为什么你还需要为每个密码生成一个高成本,使这些彩虹表不能使用。
如果你想要真正安全,可以使用像PKCS#5中所示的PBKDF2。
答案 1 :(得分:1)
哈希密码不是加密。这是一个单向的过程。
查看security.stackexchange.com以及与密码相关的问题。它们如此受欢迎,我们专门将this blog post放在一起,以帮助个人找到有用的问题和答案。
This question专门讨论了连续20次使用md5 - 请查看Thomas Pornin的回答。他回答的要点:
答案 2 :(得分:1)
关于crypto.SE有这样一个问题,但现在还没有公开。 Paŭlo Ebermann的答案是:
对于密码哈希,您不应使用普通的加密哈希, 但是专门用来保护密码的东西,比如bcrypt。
有关详细信息,请参阅How to safely store a password。
重要的是,密码破解者不必暴力破解 哈希输出空间(SHA <1的2 160 ),但只有 密码空间,小得多(取决于您的密码) 规则 - 通常是字典帮助)。因此,我们不希望快速 哈希函数,但速度慢。 Bcrypt和朋友都是专为 此
类似的问题有这些答案: 问题是“防止密码分析突破:组合多个哈希函数” 回答Thomas Pornin:
组合是SSL/TLS对MD5和SHA-1的作用 内部“PRF”的定义(实际上是Key Derivation Function)。对于给定的散列函数,TLS定义了一个KDF 依赖于依赖哈希函数的HMAC。那么KDF就是 调用两次,一次使用MD5,一次使用SHA-1,结果是 一起出去了。这个想法是抵制任何一个的密码分析中断 MD5或SHA-1。请注意,对两个散列函数的输出进行异或 依赖于微妙的假设。例如,如果我定义SHB-256( m )= SHA-256( m )XOR C ,对于固定常量 C ,则SHB-256为 良好的哈希函数为SHA-256;但两者的异或总是屈服 C ,它对散列目的并不好。因此, TLS的建设并未得到当局的认可 科学(它恰好不会被打破)。 TLS-1.2 不再使用那种组合;它依靠单一的KDF, 可配置的哈希函数,通常是SHA-256(在2011年,它是一个聪明的 选择)。
正如@PulpSpy所指出的,连接不是一种很好的通用方式 构建哈希函数。这是由Joux于2004年出版的 由Hoch and Shamir in 2006推广,适用于大类 涉及迭代和连接的构造。但请注意 精细打印:这并不是关于哈希中存在的弱点 功能,但关于让你的钱值得。也就是说,如果你拿一个 具有128位输出的散列函数和具有160位输出的散列函数, 并连接结果,然后碰撞阻力将是没有 比两者中最强者差; Joux展示的是它会 也不是更好。有128 + 160 = 288位输出,你 可以瞄准2 144 阻力,但Joux的结果意味着 你不会超过2 87 。
所以问题就变成了:如果可能的话,有没有办法高效 方法,结合两个哈希函数,使结果为 抗冲击性是两者中最强的,但不会产生影响 连接的输出扩大? 2006年,Boneh and Boyen发布了一个简单说明答案的结果 是否,仅受评估每个散列函数的条件限制 一旦。 编辑: Pietrzak在2007年解除了后一种情况 (即多次调用每个散列函数都无济于事。)
并PulpSpy:
我确信@Thomas会给出一个彻底的答案。在中间地区,我会 指出你的第一个建筑的抗冲击性, 令人惊讶的是H1(m)|| H2(M)并不比H1(M)好多少。看到 本文第4部分:
http://web.cecs.pdx.edu/~teshrim/spring06/papers/general-attacks/multi-joux.pdf
答案 3 :(得分:0)
不,这不是一个好习惯,你必须使用$ salt进行加密,因为密码可以用那些彩虹表破解