为什么 BCrypt 对彩虹表特别有效?

Why is BCrypt specifically effective against rainbow tables?

如果有人拥有BCrypt的加密功能,将密码字典加密后存入光盘。访问数据库中的散列密码,他们不应该吗?

我希望答案是否定的。如果是这样,为什么不呢?

Bcrypt 与其他 PBKDF 函数一样,包括加盐和拉伸。加盐意味着它会在密码中添加一些额外的随机数据。盐是public。因此,例如,如果我的盐是 "f588d29a" 并且我的密码是 "password" 我实际上要散列的东西是 "f588d29apassword" (这不是 bcrypt 的确切方式,但它是等价的)。

加盐后,您将散列(稍后更多),输出将是:"f588d29a,hash"。所以盐和哈希是众所周知的。但是现在你的彩虹 table 包括 "password" 没有任何用处。您需要 "f588d29apassword" 以及 "aaaaaaaapassword" 和 "aaaaaaabpassword" 以及... lot 的密码散列。因此,这会显着增加您需要的时间和 space。更长的盐可以使攻击者任意地难以做到这一点,而防御者的成本却很小。这是让 rainbow tables 基本上没用的部分。即使我发现多个人使用相同的密码,他们的哈希值也会不同,所以我的 table 没有帮助。

bcrypt(和其他 PBKDF)的后半部分是拉伸的,这意味着执行哈希函数是时间密集型的。我们通常说的是几十毫秒,所以这对人类或一个哈希来说没什么大不了的,但它会使密码猜测变得更加昂贵。