bcrypt和hashing多次有什么区别?

时间:2011-08-16 00:52:40

标签: hash passwords password-protection bcrypt

bcrypt如何强于,比如

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

我觉得,鉴于它的炒作,比我更聪明的人已经发现bcrypt比这更好。有人可以解释“聪明的外行人”条款的区别吗?

5 个答案:

答案 0 :(得分:4)

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

在验证数据时,您需要速度,因为您希望尽快验证数据。

当您尝试保护凭据时,速度对您不利。具有密码哈希副本的攻击者将能够执行更多暴力攻击,因为MD5和SHA1等执行起来很便宜。

相比之下,bcrypt特意昂贵。当有一两次尝试由真正的用户进行身份验证时,这一点很少,但是对于暴力来说,太多成本更高。

答案 1 :(得分:3)

与MD5在bcrypt和哈希多次之间存在三个显着差异:

  1. 输出大小:MD5为128位(16字节),bcrypt为448位(56字节)。如果在数据库中存储数百万个哈希值,则必须将其考虑在内。
  2. 对MD5可能发生碰撞和前像攻击。
  3. 随着cpu越来越强大,Bcrypt可以配置为迭代越来越多。
  4. 因此,使用MD5进行腌制和拉伸并不像使用bcrypt那样安全。通过选择比MD5更好的散列函数可以解决此问题。

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

答案 2 :(得分:1)

您正在有效地讨论实施PBKDF2或基于密码的密钥派生函数。实际上它与BCrypt是一回事,其优点是可以延长导出密码所需的CPU时间。这比BCrypt这样的优势在于,通过了解密码输入的“迭代次数”,当需要增加密码时,可以执行,不用重置数据库中的所有密码。只需让你的算法选择最终结果就像它在第n次迭代(其中n是先前的迭代计数)并继续前进!

建议你使用一个合适的PBKDF2库而不是创建自己的库,因为让我们面对它,就像所有加密一样,你知道某些东西是否安全的唯一方法是它是否已经被互联网“测试”了。 (见here

使用此方法的系统:
.NET已经实现了一个库。见here
Mac,Linux和Windows文件加密使用此加密方法的许多itteration(10,000+)版本来保护其文件系统 通常使用这种加密方法来保护Wi-Fi网络 Source

感谢您提出问题,它迫使我研究我用来保护密码的方法。

TTD

答案 3 :(得分: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-hashed密码并继续迭代,因为您必须知道原始密码。我无法证明这一点,但我认为这使得Bcrypt比简单的哈希循环更安全。

答案 4 :(得分:0)

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

  

OrpheanBeholderScryDoubt

64次。

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