最安全的密码哈希算法?

信息安全 密码 密码学 哈希
2021-08-28 16:12:13

目前最安全的哈希算法是什么?在 PHP 中可用

速度无关紧要,因为我在固定时间(而不是固定数量的迭代)内迭代哈希。我感兴趣的是数学强度。

我的直觉告诉我这是漩涡,是其中最大和最慢的。那或SHA-512。但是在网上哪里可以看到专家的建议?

4个回答

密码学家可以指出,当您阅读细则时,没有证据表明安全散列函数确实存在。我们现在唯一拥有的是尚未发现弱点的候选人。

因此,您可以期望的最好的功能是经过许多密码学家长期审查的功能。此外,您需要它具有足够宽的输出(如果您希望实现“128 位安全性”,那么 256 位就足够了,并且超出此范围几乎没有意义)。现在,截至 2011 年夏天,这指向 SHA-256 或 SHA-512,而不是 Whirlpool。

将迭代计数基于典型机器上花费的时间是一个好主意——但基于它在您的机器上实际花费的时间并不是一个好主意。否则,您可能会因为机器当时正在处理许多请求而导致某些密码的迭代计数较低(顺便说一句,这是攻击者可以强制执行的情况)。使用多次迭代旨在通过使攻击者的密码散列变慢来阻止攻击计算机——它也会让你的系统变慢,这是一个不幸的副产品;但真正的目标是攻击者可以召集的任何机器力量。由于您无法真正在攻击者的机器上进行基准测试,因此您必须求助于粗略估计,因此只要您的系统可以承受平均负担(这里的重要词是“平均”,即取消您打算执行的动态测量的资格)。

此外,攻击者的机器不需要看起来像你的机器;例如,它可能是GPUFPGA,它们提供了与典型服务器不同的计算能力。您需要一个攻击者无法通过使用非 PC 硬件获得巨大性能提升的功能。再一次,这促进了 SHA-256 或 SHA-512,它们旨在提高 CPU 效率(使用 32 位或 64 位算术运算),而不是 Whirlpool,它可以从类似于 AES 设计的硬件优化中受益。

最后,迭代只是工作的一部分;你还需要足够长、足够独特的盐。同时进行迭代和加盐可能有点棘手。强烈建议您使用标准结构,例如PBKDF2(尽管它是作为密钥派生函数,而不是密码散列器,但 PBKDF2 在这方面也相当出色)。

从OP的评论:

“安全”是基于一个没有已知快速解决方案的数学问题。基于此类问题中最复杂的“最安全”。散列算法在破解它需要对密码学/数学做出重大贡献时被认为是“强大的”。

听起来您好像一直在阅读Thomas Ptacek 的“彩虹表足够了:您需要了解的有关安全密码方案的知识”,现在您想知道哪种现代密码散列针对密码存储进行了优化被认为是“最安全的”。

我不认为有一个明确的答案。据我所知,目前编程社区中的一些最爱(scrypt 和 bcrypt)还没有作为密码散列函数经过严格的同行评审。至少,它们没有经过大量密码学家的同行评审,与NIST 哈希函数竞赛条目的审查方式相当。

也就是说,目前 Hacker News 的共识是,顺序是:

  1. 加密因为它既是内存密集型又是 CPU 密集型的,因此 scrypt 被认为具有当前密码哈希值的最高安全边际你可以在这里看到更多关于它的设计
  2. bcrypt 是之前的冠军,正如上面 Thomas Ptacek 的博客文章中提到的那样。
  3. PBKDF2和多轮 SHA2(fx Unix Crypt with SHA256)被认为是第三好的(其中一个是“最好的”很大程度上取决于使用的迭代次数)。

(请注意,“黑客新闻”主要是一个编程社区,而不是名称可能暗示某些安全专家社区(即使其中一些也在那里闲逛)。)

如果您在此站点上环顾四周,在密码学 密码散列标签 fx 下,您会发现通常没有提到单个“最佳”密码散列。我想这部分是因为真正的密码学家没有明确的共识,因为同行评审相对有限。

这是一个相当公平且易于阅读的比较(不包括 scrypt,大概是因为它仍然太新)。

速度无关紧要,因为我在固定时间(而不是固定数量的迭代)内迭代哈希。

使用其中一些哈希值,您无法真正做到这一点。当您调用库时,您提供一个“工作因素”,其余的由库负责。

CRYPT_BLOWFISH(OpenBSD bcrypt,基于河豚对称密码,但它是一种实际的散列算法,对此似乎有很多混淆)和 CRYPT_SHA512 是最好的。这两者都提供了扩展使用的“轮数”数量的选项,允许您选择安全/性能权衡。

例如,河豚的默认轮数为 7(值范围为 4-31)。这个值是对数的,所以每次增加都会导致算法运行 10 倍。值为 13,在 Core2Duo 2.4ghz 上每个哈希几乎需要 1 分钟

将其调高到可以容忍的性能水平,将产生最强的安全性。

注意:最近在 bcrypt 的某些实现中发现了一个错误,因此,您可能希望改用 SHA-512。

注意:SHA-512 在 64 位处理器上的计算速度比 SHA-256 更快(尤其是在使用 SSE2_64 进行优化的情况下。具体来说,您应该考虑这一点并使用额外的轮次来确保您的哈希足够强大以达到其目的。

开源应用程序hashkill发布了一些关于现代 GPU 能够以多快的速度破解现代散列算法的性能基准。具体来说,Radeon HD 6990 可以做到: 11001 Megahashes/sec 的直接 MD5(CRYPT_MD5 是加盐的,FreeBSD 实现使用 100 轮)。3444 兆哈希/秒的直 SHA1。

我建议你使用phpass

这是一个可移植的公共域密码散列框架,用于 PHP 应用程序。它适用于 PHP 3 及更高版本,到目前为止,它实际上已在至少 PHP 3.0.18 到 5.3.0 上进行了测试。

phpass 支持的首选(最安全)散列方法是 OpenBSD 风格的基于 Blowfish 的 bcrypt,也支持我们的公共域 crypt_blowfish 包(用于 C 应用程序),在 PHP 中称为 CRYPT_BLOWFISH,回退到 BSDI 风格的扩展基于 DES 的散列,在 PHP 中称为 CRYPT_EXT_DES,最后的手段是回退到在 phpass 本身中实现的基于 MD5 的加盐和可变迭代计数密码散列(也称为可移植散列)。

就像网站说的基于 Blowfish 的 bcrypt 是最安全的散列。我相信这是真的,因为它是“摩尔定律证明”,而大多数其他人都不是。