密码散列“忙于工作”是否需要加密安全

信息安全 密码 哈希 显卡
2021-09-08 05:07:38

所有现代密码散列方案都被故意设计为包含大量“忙碌工作”,以限制攻击者能够进行密码散列尝试的速度。此外,较新方案的一个目标是减少使专用硬件比类似成本的商品硬件更有效的数量。如果几种算法中的每一个中的“工作单元”被定义为针对该任务优化的每美元硬件每秒可以完成的工作量,那么目标是最大化可以完成的工作单元的数量在可接受的时间范围内使用生产硬件。但是,由于商品机器执行各种操作的效率不同,这表明不同的算法在不同的生产机器上是最佳的。例如,虽然如果生产机器没有 GPU,则希望算法对 GPU 不友好,但在可以使用 GPU 的生产平台上,最好有一个 GPU 友好的繁忙工作算法。

给定密码哈希算法:

hash = secureHash(password, salt)
Using one or more forms of busywork:
  busyResult = busyWork(hash, params)
  hash = secureHash(hash, busyResult, extraSalt)

如果假设secureHash 具有安全散列所需的所有属性,那么整体安全性是否会依赖于所使用的busyWork 函数的任何加密属性,而不是它们的输出在不执行一定量的工作的情况下是不可计算的?如果不是,那么在不同的生产环境中支持不同类型的忙碌工作是否合理,如果:

  1. 每个密码记录都包含一个用于创建它的忙碌工作形式的列表,以及适当的参数。

  2. 每个生产环境都能够执行各种形式的繁忙工作,即使效率不高。

  3. 如果硬件更改会导致当前密码算法花费比理想时间更长的时间,用户存储的密码哈希可以透明地更新,以便在用户下次登录时使用新算法(用户不需要知道这正在发生)。

尝试为每种不同风格的系统设计一种安全的散列算法,并围绕该系统的精确能力进行优化是很困难的。然而,如果要求较弱,并且只需要证明busywork算法接近于在给定系统上产生特定输出的最快方法,并且输入算法的每个不同的哈希值都可能产生不同的输出(如果输出可能比输入大得多,这并不难),似乎为不同平台优化算法会容易得多。

主要问题:如果secureHash函数很好,并且至少一些忙函数所需的时间不能有效减少,那么一个糟糕的忙函数是否会损害安全性,除了采取远离更好的繁忙工作功能的时间?

2个回答

密码散列“忙于工作”是否需要加密安全

是的。您需要它使用标准算法来确保没有可用于“忙碌工作”的快捷方式。在这里查看Thomas Pornin 的答案

插入盐(是的,必须讨论)并同时迭代函数,这比通常出现的要复杂一些。特别是,像 SHA-256 这样的散列函数并不完全是一个“类随机预言”的函数。它展示了一些内部结构。任何自制的构造都可能触及可能出现致命弱点的精细细节之一。

确保你做对了是很困难的,就像构建任何加密算法一样。这就是 bcrypt 比任何自制结构更好的地方:bcrypt 已经发布并投入使用,并且可能在相当长的一段时间内被许多人检查过是否存在缺陷。这基本上是您可以在密码学中获得的唯一硬性安全措施。“不要定义自己的算法”的一般建议也适用于此。

在你的声明中:

如果secureHash函数很好,并且至少一些忙函数所需的时间不能有效减少,那么除了占用时间之外,还有什么方法可以让一个糟糕的忙函数危及安全?更好的繁忙工作功能?

抽出时间是件好事,尽管如果存在捷径,那么花费的时间最好花在“久经考验”的迭代散列算法的方法上。如果久经考验的方法将通过 1024 次迭代有效地添加 10 位熵,那么您不希望您的“糟糕的忙碌工作”函数能够成为快捷方式,因此不会添加额外的等效熵。这会为您的系统增加时间,但不会为攻击者增加时间。一个好的迭代哈希函数应该为攻击者增加更多时间,因为他们需要比有效用户更多的猜测。

我意识到您的问题类似于“假设攻击者具有最快的生成哈希的方法”,但是在我的生产硬件上,我希望每个平台都使用“创建安全哈希的最快方法”。在这种情况下,您可以为不同的机器使用不同的算法,但您应该使用标准算法(bcrypt、scrypt、PBKDF2),如果攻击者掌握了您的密码数据库,您将受制于最弱的算法。

在您对先前答案的评论中:

在大多数加密函数中,假设攻击者没有在正向使用加密函数所需的参数,因此必须反转它,目标是最大化反向和正向之间的速度差异. 添加不安全的东西会减慢前进方向,但可能不会影响反向。

加密哈希函数应该几乎不可能反转。攻击者在尝试破解散列时实际上会使用与您使用的相同算法对他们的猜测进行散列 - 所以他们会朝“正向”前进,看看他们是否有匹配。您不应该假设您的“忙碌工作”或散列算法是秘密的 - 假设攻击者不知道的唯一秘密是密码。唯一出现“反向”的情况是当它们具有预先计算的彩虹表或哈希表时——如果你有足够强的盐,那么这将阻止这种攻击向量。

因此,使散列函数快速运行但难以逆转的目标似乎存在缺陷。它应该运行缓慢并且不可能逆转。您应该尝试阻止的唯一“逆转”是通过使攻击者每次猜测做更多工作而重复尝试的那些。

这主要是语义问题……加密是为了确保打破它所需的时间(通过猜测一些值)尽可能大。“花时间”意味着攻击者可以更快地破坏您的安全性。— 也就是说,实际使用中的所有加密都可以在无限时间的情况下被“破解”(例如:“简单地”猜测一个私钥)。

如果你的“糟糕的工作”只是“将数字 X 加 10 十亿次”,那么攻击者会将其缩减为“将 X 加 100 亿”,从而消除所有用处。