密码散列的黄金标准

信息安全 密码 哈希 。网 pbkdf2 沙2
2021-09-02 19:17:54

我正在开发一个将处理高度敏感信息的 Web 应用程序,并且我想确保密码的散列是黄金标准。理想情况下,我会使用 PBKDF2 为每个用户加盐 SHA512 来执行算法的多次迭代,但是当我在 asp.net 中开发时,PBKDF2 没有内置的 .net SHA512 版本 - 我仅限于 SHA1 (即 Rfc2898DeriveBytes)。

我的问题是真的,记住我正在.net 中开发并保护敏感信息,散列用户密码的最佳方法是什么?

我应该坚持使用 .net 的 SHA1 PBKDF2 实现吗?
我应该使用 PBKDF2 的自定义实现来合并 SHA512 吗?
我应该更喜欢 bcrypt 还是 scrypt,尽管它们没有得到广泛的标准认可(例如 NIST)?

4个回答

我会选择 in-built Rfc2898DeriveBytes,迭代次数很多 - 数字越高越好,但我建议绝对最小值为 5000。SHA1 在某些用途中被认为是损坏的,但与 PBKDF2 中使用的方式不同,并且可能永远不会出现在产品的生命周期内。

不过,使用 SHA512 实现您自己的 PBKDF2 应该不难。事实上,微软提供了一个使用 SHA256 的参考实现。

Bcrypt 比 PBKDF2 稍微“更好”但是,PBKDF2 已经很好了:使用得当,它不再是您系统中的最薄弱环节。

请记住,PBKDF2 中迭代的目的是使攻击者的密码散列速度变慢不幸的是,它也会让你变慢。因此,您需要避免让它对您来说过于缓慢。特别是考虑 SHA-512:SHA-512 使用了大量的 64 位算术运算。攻击者可以购买擅长 64 位操作的 PC(最近足够多的 x86 CPU 具有 64 位模式,较旧的处理器可以使用 SSE2 操作码)。另一方面,您的服务器可能会受到更多限制:如果您的服务器在 32 位模式下运行,那么 SHA-512 对您来说会很慢(因为您使用 .NET 而在 .NET 中您不会摆弄SSE2 操作码),为攻击者提供计算优势(约 6 倍)。

使用系统提供的 PBKDF2 实现可以最大限度地避免这种人为的减速(特别是它可以使用 SHA-1 的本机代码实现)。在 PBKDF2 中使用时,SHA-1 的已知缺点不会影响其安全性。

如果您“自己”做任何事情,那么您必须了解这些性能问题及其所有细节;而且,如果出现任何问题,您可能会受到指责。

就个人而言,我会继续使用 BCrypt。该算法可能未在 NIST 中列出,但它已经存在了足够长的时间(现在 13 年,而 Blowfish 密码本身也快 20 年了),我相信它。相比之下,MD5 在引入仅仅 5 年后就被证明是脆弱的,并且被认为在 18 年内被完全破坏。

Blowfish 密码在其 20 年中唯一已知的攻击是已知明文攻击,需要指数数量的已知输入消息和生成的密文(2^8n+1,其中 n 是 Feistel 密码的轮数;对于标准16 轮河豚,即 2^129) 来导出密钥。对于 BCrypt,同样的攻击是不可行的;首先,只有一个明文对 BCrypt 是“有效的”(ASCII 字符串“OrpheanBeholderScryDoubt”),其次,通过输入其他明文进行逆向工程的密钥是指数复杂密钥推导函数的结果这首先混淆了密码。在 Unix 系统的一个 C 实现中显示了一个漏洞,如果输入包含非基本 ASCII 字符的密码,就会破坏算法;

现在,虽然我更喜欢 BCrypt,但 PBKDF2 毫不逊色。尽管 SHA-1 因其恒定且相对较低的复杂性而被认为易受攻击,但通过从云提供商租用足够的 CPU 来执行该攻击来破坏单个哈希的估计成本约为 277 万美元。在 PBKDF2 中,SHA-1 用作 HMAC,这意味着每次推导函数迭代至少执行两次 SHA-1 散列。使用 5,000 次迭代和 320 位的密钥长度(需要两组 5,000 次迭代,每个派生密钥的一半),破坏单个哈希的任何漏洞都会被您必须对 20 进行逆向工程的事实所抵消数千个(增加大约 2^14.3 的复杂性,使完整的攻击类似于 2^175)。

将破解一个 SHA 哈希的 270 万美元成本乘以增加的复杂性,您将得出……破解一个 PBKDF2 哈希“很长一段路”(对输入密码一无所知)的代价约为 554 亿美元。任何有这种划痕的人,想要你的秘密,都会找到更便宜的方法

如果您关心某人密码的安全性,您应该远离 PBDKF2,至少要远离 BCrypt。看看破解硬件的最新技术。

对于硬件中的 BCrypt 破解,请查看High-Speed Implementation of bcrypt Password Search using Special-Purpose Hardware

| Algorithm  | hashes/sec | hashes/sec/Watt |
|------------|------------|-----------------|
| BCrypt(12) |      410.4 |           20.52 |
| BCrypt(5)  |   51,437   |        2,572    |

他们创建了一个定制的 ASIC(“Virtex-7”),比 CPU 快 10 倍(比视频卡快 30 倍),并且只使用两者中 6% 的功率。

这是破解 BCrypt 密码的最新技术。现在将其与PBKDF2. 我有一个每秒计算 350M 哈希的 2.5W USB 记忆棒您可以尝试 1,000 次迭代、5,000 次迭代,甚至是 iOS 标准的 10,000 次迭代:

| Algorithm   | hashes/sec | hashes/sec/Watt |
|-------------|------------|-----------------|
| BCrypt(12)  |      410.4 |           20.52 |
| BCrypt(5)   |   51,437   |        2,572    |
| PBKDF2(10k) |   35,000   |       14,000    |
| PBKDF2(5k)  |   70,000   |       28,000    |
| PBKDF2(1k)  |  350,000   |      140,000    |

每个 2.5W USB 记忆棒的成本约为 8 美元(我有 14 个连接到我的服务器)。

  • Virtex-7定制 ASIC:3,495 美元
  • USB记忆棒:8美元

使用成本

| Algorithm   | hashes/sec | hashes/sec/Watt | hashes/sec/$ |
|-------------|------------|-----------------|--------------|
| BCrypt(12)  |      410.4 |           20.52 |       0.1174 |
| BCrypt(5)   |   51,437   |        2,572    |      14.717  |
| PBKDF2(10k) |   35,000   |       14,000    |   4,375      |
| PBKDF2(5k)  |   70,000   |       28,000    |   8,750      |
| PBKDF2(1k)  |  350,000   |      140,000    |  43,750      |