php.net 上的“官方声明”:CRYPT_BLOWFISH 是最强的哈希算法。为什么?

信息安全 哈希 php bcrypt 河豚
2021-08-23 21:30:56

首先:我在stackoverflow上问了这个问题,并被要求再次在这里发布。请参阅此处的原始问题

根据新的 PHP 5.5 密码哈希/加密 API 的 [早期] 文档页面,使用的算法CRYPT_BLOWFISH是“PHP 当前支持的最强算法”(请进行全文搜索以找到页面上的引用)。

我的问题是:这可以用一些数字、基准等来证明吗?

根据 PHP 的crypt() doc page CRYPT_BLOWFISH使用 22 char salt 并生成 60 char hash,并CRYPT_SHA512使用 16 char salt 并生成 118 char hash。两种算法都有可变的成本因素,所以乍一看,SHA512 看起来更强(因为更长)。

2个回答
  • 我们在这里谈论的是最强大的密码散列。一个好的通用哈希不需要是一个好的密码哈希,反之亦然。
  • 一旦超过某个阈值,哈希的长度就无关紧要了。对 n 位散列的原像攻击花费 2 n对于 128 位散列,这是完全不可行的。
  • bcrypt 使用指数符号表示成本,sha512-crypt 使用线性符号是无关紧要的。将它们的 CPU 成本与默认参数进行比较也是没有意义的。

    在实践中,您选择一个时间预算,例如 10 毫秒。然后调整散列的成本因子以匹配该预算。因此,如果攻击者使用与防御者相同的硬件,那么所有像样的密码散列都是相同的。

  • 攻击者使用与防御者不同的硬件。防御者使用标准 CPU。攻击者至少使用 GPU,或者如果它是高级攻击者,则可能使用 FPGA 或 ASIC。

    不同哈希之间的区别在于它们在不同类型的硬件上运行的好坏。BCrypt 需要几千字节的非常快的内存。这适用于普通 CPU,但不适用于 GPU。所以 bcrypt 对 GPU 非常不友好。使用 FPGA,bcrypt 的优势更小,尤其是在它具有集成 RAM 的情况下。但它仍然好一点。

  • 一个简单的基准测试,您可以将候选哈希调整为相同的成本。然后运行基于 GPU 的密码破解程序,例如 hashcat 或 john-the-ripper 并检查其性能。我预计 bcrypt 的哈希率会低得多。
  • 还有另一种有趣的密码方案,称为 scrypt。它使用大量内存,如果您的时间预算很大,它明显优于 bcrypt 或 SHA512-crypt。

“数学证明”是你​​可以任意选择N:

t(bcrypt) * (2^N) >> t(sha)

最终的哈希是为了避免碰撞,所以只要你是安全的

hash >> password

盐就是避免彩虹桌,所以只要你是安全的

(rainbow table size) * (salt) >> (attacker storage space)