多次加密(MD5)可以提高安全性吗?

时间:2011-07-29 05:45:50

标签: cryptography md5 password-hash pbkdf2 cryptographic-hash-function

我看到有人用MD5多次加密用户密码以提高安全性。我不确定这是否有效,但看起来并不好。那么,它有意义吗?

4 个答案:

答案 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的回答。他回答的要点:

  • 20太低,应该是20000或更多 - 密码处理仍然太快
  • 没有盐:攻击者可能以非常低的密码成本攻击密码,例如:彩虹表 - 可以为任意数量的md5周期创建
  • 由于无法确定给定算法是否安全,因此发明自己的加密通常会导致灾难。不要这样做

答案 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进行加密,因为密码可以用那些彩虹表破解