2011-08-16 42 views
14

怎么比,比如说强bcryptbcrypt和散列多次之间有什么区别?

def md5lots(password, salt, rounds): 
    if (rounds < 1) 
     return password 
    else 
     newpass = md5(password + salt) 
     return md5lots(newpass, salt, rounds-1) 

给我的感觉,因为它的炒作,更聪明的人比我想通了bcrypt是比这更好的。有人能解释“聪明门外汉”中的区别吗?

+1

bcrypt的循环次数是'2^i',所以它是指数增长,但是,在相关笔记上非常好的问题是,将bcrypt与HMAC hash进行比较将会很有趣硬化”。 – 2011-08-16 01:07:10

回答

3

有bcrypt和之间的三个显著差异散列多次用MD5:

  1. 输出的大小:128位(16字节),用于MD5和448位(56字节)用于bcrypt。如果您将数百万散列存储在数据库中,则必须将其考虑在内。
  2. 碰撞和原像攻击对MD5是可能的。
  3. 随着cpu的功能越来越强大,Bcrypt可以配置越来越多。

因此,使用MD5进行腌制和拉伸并不像使用bcrypt那么安全。这个问题可以通过选择比MD5更好的散列函数来解决。

例如,如果选择SHA-256,则输出大小将为256位(32字节)。如果salting-and-stretch可以配置为增加像bcrypt这样的迭代次数,那么除了存储结果散列所需的空间量之外,两种方法之间没有区别。

+0

如果您使用bcrypt具有预先哈希的密码(工作因子12),并且您将工作因子增加到14,那么您是否必须重设密码?或者可以在给定工作因子的情况下重新散列哈希密码 –

+0

好的,忘记MD5,这不是我的问题的要点。假设我的示例程序中有一个随机散列,与bcrypt的输出一样长。点1被消除。点3也被淘汰,因为我上面的例子解决了这个问题(重复哈希来缩短CPU时间)。第2点仍然是:假设一个更好的哈希,是什么让bcrypt更好? –

+0

@luke没有,如果你可以配置你的腌制和拉伸的迭代次数 – JVerstry

1

您正在有效地谈论实施PBKDF2或基于密码的密钥推导函数。实际上它与BCrypt是一样的,其优点是可以延长获取密码所需的CPU时间。与BCrypt相比,这样做的好处是,通过知道有多少'迭代'可以让您通过密码,当您需要增加密码时,您可以执行而不需要重置数据库中的所有密码。只要你的算法拿起最终结果,就好像它在第n次迭代(其中n是先前的迭代计数)并继续进行!

建议您使用一个合适的PBKDF2库,而不是创建自己的库,因为让我们面对它,就像所有加密技术一样,唯一的方法就是知道某些东西是否安全,如果它已经被interwebs'测试'。 (见here

系统使用此方法:
.NET已经实现了一个图书馆。请参阅here
Mac,Linux和Windows文件加密使用此加密方法的许多密码(10,000+)版本来保护其文件系统。
Wi-Fi网络所使用的加密这种方法对提出的问题
Source

由于经常保护,它迫使我的研究,我是使用针对保护我的密码的方法。

TTD

4

主要区别 - 用于验证数据的MD5和其他哈希函数被设计得很快,而bcrypt()被设计得很慢。

当您验证数据时,您需要速度,因为您希望尽可能快地验证数据。

当您尝试保护证书时,速度对您不利。具有密码哈希副本的攻击者将能够执行更多的蛮力攻击,因为MD5和SHA1等执行起来很便宜。相比之下,bcrypt是故意昂贵的。当有一两次尝试由真正的用户进行认证时,这一点很重要,但是对于暴力破解来说成本更高。

0

严格地说,bcrypt实际上加密文本:

OrpheanBeholderScryDoubt

64倍。

但它使用从密码和一些随机生成的盐中派生出来的密钥。

1

虽然这个问题已经得到解答,但我想指出BCrypt和哈希循环之间的细微差别。我会忽略已弃用的MD5算法和指数成本因素,因为您可以在您的问题中轻松改进这一点。

您正在计算散列值,然后使用结果计算下一个散列值。如果您查看BCrypt的实现,您可以看到,每次迭代使用生成的哈希值以及原始密码(密钥)。

Eksblowfish(cost, salt, key) 
    state = InitState() 
    state = ExpandKey(state, salt, key) 
    repeat (2^cost) 
    state = ExpandKey(state, 0, key) 
    state = ExpandKey(state, 0, salt) 
    return state 

这是什么原因,你不能把一个Bcrypt散列密码,并继续进行迭代,因为你必须知道原来的密码即可。我无法证明它,但我想这使得Bcrypt比简单的哈希循环更安全。

相关问题