使用 HMAC SHA1 的 Rfc2898DeriveBytes 是否仍然被认为对于散列密码“足够安全”?

信息安全 密码 哈希 。网
2021-08-14 13:05:40

CISSP告诉我,.NET 类 Rfc2898DeriveBytes 今天不会通过安全审核,因为它仍然使用 SHA1。它对 SHA1 的依赖——即使有迭代——使它太容易受到暴力破解。对于我自己的理解和任何其他偶然发现这个问题的人,Rfc2898DeriveBytes 是否仍然被认为是一种安全的密码散列方法?同样,HMAC SHA256 加盐但没有迭代就足够了吗?

作为记录,因为我被要求使用除 Rfc2898DeriveBytes 以外的任何东西,而且我知道最好不要从头开始自己编写,我打算反汇编 Rfc2898DeriveBytes 并使用 SHA256 而不是 SHA1 复制代码。

1个回答

Rfc2898DeriveBytes实现称为PBKDF2并在RFC 2898(因此得名)中定义的标准算法。该算法使用可配置的底层伪随机函数,通常是HMAC,而 HMAC 本身依赖于可配置的底层散列函数,通常是 SHA-1。虽然所有这些都是可配置的,但给定的实现可能不那么灵活,并且实际上Rfc2898DeriveBytes 总是使用 HMAC 并且总是使用 SHA-1 作为 SHA-1 的底层函数。

如今,统称为“审计员”的人们看到任何涉及SHA-1 的东西时,往往会哭泣、抱怨、尖叫、嘲笑和转圈。这在科学上是没有根据的。目前,在所有已发表的 Science 中,没有丝毫迹象表明在 HMAC 中使用SHA-1会很弱。SHA-1 中的已知弱点是关于不影响 HMAC的冲突(无论如何这些仍然是理论上的)。如果某个拥有 CISSP 的人坚持认为 SHA-1 实际上使 PBKDF2 更容易受到暴力破解,那么那个人应该重新学习他的课程。

尽管如此,切换 SHA-256 并不是一个坏主意,所以如果避开 SHA-1 是摆脱审计人员所需要的,那就这样吧。

但是,仍然必须说以下几点:

  • 反汇编然后修改是一种相当粗略的方法,往往会导致无法维护的代码。您可以简单地从实际的源代码开始(例如,从这里开始),或者更简单(并且具有更清晰的法律地位),从头开始重新实现它。.NET 提供HMAC/SHA-256 实现用它来做一个 PBKDF2 代码并不难。

  • 或者,您可以尝试重用其他一些现有的实现,例如这个

  • 当您想要“散列密码”时使用 PBKDF2,并且在这方面并非所有功能都是平等的。散列函数只有在攻击者计算成本高昂的情况下才有用。在这方面,带有 SHA-1 或 SHA-256 的 PBKDF2 不是最佳选择;可以说,带有 SHA-512 的 PBKDF2 是更好的选择(因为现有 GPU 优化 SHA-512 比 SHA-256 更难),但其他解决方案可能更可取,尤其是bcrypt有关此主题的更多信息,请阅读this,更一般地阅读this

    这意味着虽然 SHA-1 “弱点”不会使 PBKDF2 更弱,但它仍然是一个可以在 GPU 上很好优化的函数,在这种情况下,这是一个问题——但是,这就是这里的重点, SHA-256 也好不到哪里去。

  • 在任何情况下,通过使用纯 C# 实现,您接受这种特定的 CPU 密集型将随着该技术固有的减速而运行,与优化的 C 代码(或汇编)相比,可以估计为 2 到 3 倍. 换句话说,您为攻击者提供了 2 倍或 3 倍的优势。因此,您可能希望在此处使用一些本机代码,而不是纯 C#。