所有现代密码散列方案都被故意设计为包含大量“忙碌工作”,以限制攻击者能够进行密码散列尝试的速度。此外,较新方案的一个目标是减少使专用硬件比类似成本的商品硬件更有效的数量。如果几种算法中的每一个中的“工作单元”被定义为针对该任务优化的每美元硬件每秒可以完成的工作量,那么目标是最大化可以完成的工作单元的数量在可接受的时间范围内使用生产硬件。但是,由于商品机器执行各种操作的效率不同,这表明不同的算法在不同的生产机器上是最佳的。例如,虽然如果生产机器没有 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 函数的任何加密属性,而不是它们的输出在不执行一定量的工作的情况下是不可计算的?如果不是,那么在不同的生产环境中支持不同类型的忙碌工作是否合理,如果:
每个密码记录都包含一个用于创建它的忙碌工作形式的列表,以及适当的参数。
每个生产环境都能够执行各种形式的繁忙工作,即使效率不高。
如果硬件更改会导致当前密码算法花费比理想时间更长的时间,用户存储的密码哈希可以透明地更新,以便在用户下次登录时使用新算法(用户不需要知道这正在发生)。
尝试为每种不同风格的系统设计一种安全的散列算法,并围绕该系统的精确能力进行优化是很困难的。然而,如果要求较弱,并且只需要证明busywork算法接近于在给定系统上产生特定输出的最快方法,并且输入算法的每个不同的哈希值都可能产生不同的输出(如果输出可能比输入大得多,这并不难),似乎为不同平台优化算法会容易得多。
主要问题:如果secureHash函数很好,并且至少一些忙函数所需的时间不能有效减少,那么一个糟糕的忙函数是否会损害安全性,除了采取远离更好的繁忙工作功能的时间?