14

bcrypt比,比如说,

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

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

4

5 回答 5

4

主要区别 - MD5 和其他旨在验证数据的哈希函数被设计为快速,而 bcrypt() 被设计为缓慢。

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

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

相比之下,bcrypt 是故意昂贵的。当真正用户尝试进行一两次身份验证时,这无关紧要,但暴力破解的成本要高得多。

于 2011-08-22T11:31:48.217 回答
3

bcrypt 和MD5多次散列之间存在三个显着差异:

  1. 输出大小:MD5 为 128 位(16 字节),bcrypt 为 448 位(56 字节)。如果您在数据库中存储数百万个哈希值,则必须考虑到这一点。
  2. 针对 MD5 的冲突和原像攻击是可能的。
  3. 随着 cpu 变得越来越强大,Bcrypt 可以配置为越来越多地迭代。

因此,在 MD5 中使用 salting-and-stretching 不如使用 bcrypt 安全。这个问题可以通过选择比 MD5 更好的哈希函数来解决。

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

于 2011-08-19T01:02:24.343 回答
1

您实际上是在谈论实现PBKDF2或基于密码的密钥派生函数。实际上,它与 BCrypt 相同,优点是您可以延长获取密码所需的 CPU 时间。与 BCrypt 之类的东西相比,它的优势在于,通过知道您输入了多少次“迭代”密码,当您需要增加密码时,您可以在重置数据库中所有密码的情况下进行操作。只需让您的算法像在第 n 次迭代中一样获取最终结果(其中 n 是前一次迭代计数)并继续前进!

建议您使用适当的 PBKDF2 库而不是创建自己的库,因为让我们面对它,就像所有密码学一样,您知道某物是否安全的唯一方法是它是否已被互联网“测试”。(见这里

使用这种方法的系统:
.NET 已经实现了一个库。在这里查看Mac
、linux 和 windows 文件加密使用这种加密方法的许多迭代(10,000+)版本来保护他们的文件系统。
Wi-Fi 网络通常使用这种加密方法来保护
来源

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

TTD

于 2011-08-18T23:55:23.867 回答
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 比简单的散列循环更安全。

于 2012-09-14T11:21:19.700 回答
0

严格来说,bcrypt实际上是对文本进行加密:

Orphean旁观者ScryDoubt

64 次。

但它使用从您的密码和一些随机生成的盐派生的密钥来执行此操作。

密码散列不是散列

“密码散列算法” (如 bcrypt)的真正优点是它们使用大量 RAM。

SHA2旨在快速。如果您是实时 Web 服务器,并且想要验证文件完整性,那么您需要运行速度非常快、资源使用率非常低的东西。那是密码散列的对立面。

  • SHA2 旨在快速
  • SHA2 可以使用 128 字节的 RAM
  • SHA2 很容易在硬件中实现
  • 我拥有一个可以每秒计算3.3 亿次哈希的 USB 记忆棒设备
  • 事实上,我拥有其中的 17 个

如果您多次执行“快速”哈希(例如,10,000 是PBDKF2 的常见建议),那么您并没有真正添加任何安全性。

您需要的是一个难以在硬件中实现的哈希。您需要的是在 GPU 上难以并行化的哈希。

在过去的几十年里,我们了解到 RAM 是减缓密码哈希尝试的关键。定制硬件擅长执行原始计算(事实上,只有 1% 的 CPU 专用于计算 - 其余的专用于将机器指令快速转换为更快的东西;预取、乱序执行、分支预测、缓存)。阻碍定制硬件的方法是让算法不得不接触大量的 RAM。

  • SHA2:128 字节
  • bcrypt:4 KB
  • scrypt(可配置):16 MB 莱特币
  • Argon2(可配置):文档示例中为 64 MB

密码散列并不意味着简单地多次使用快速散列。

  • 现代推荐的 bcrypt 成本因子是 12;因此计算大约需要 250 毫秒。
  • 您将不得不执行大约 330,000 次 SHA2 迭代,才能等于现代单核 CPU 上的时间成本

但后来我们回到我的 2.5W、USB、SHA2 棒,它是 330 哈希/秒。为了防御这种情况,它必须是 83M 迭代。

  • 如果你试图只增加CPU成本:你就输了。
  • 你必须增加内存成本

bcrypt 已经 21 岁了,它只使用了 4KB。但它仍然比任何数量的 MD5、SHA-1 或 SHA2 散列都要好。

于 2012-05-04T02:13:22.620 回答