我正在开发基于从 SymmetricAlgorithm 继承的类(例如 TripleDes、DES 等)的加密功能。

基本上有两个选项可以为我的算法类生成一致的密钥和 IV, PasswordDeriveBytesRfc2898DeriveBytes, ,两者都继承自 DeriveBytes 抽象类。

PasswordDeriveBytes.GetBytes() 该方法在 .NET 框架中被标记为已过时,而建议使用 Rfc2898DeriveBytes.GetBytes(),因为它符合 PBKDF2 标准。但是,根据我的测试,调用相同的 GetBytes() Rfc2898DeriveBytes 类中的方法几乎比 Rfc2898DeriveBytes 类中的方法慢 15 倍 PasswordDeriveBytes 类,这会导致意外的 CPU 使用率(始终高于 50%)。

以下是一些测试数据:

  • 迭代次数:100
  • 算法类型:DES
  • 原文:“我是测试密钥,请给我加密”
  • 时间:
    • 密码派生字节:99毫秒
    • Rfc2898DeriveBytes:1,373毫秒

根据测试,性能较差 Rfc2898DeriveBytes 在生产环境中是不可接受的。

以前有人注意到这个问题吗?有什么解决方案可以让我仍然使用标准解决方案而不影响性能?使用过时的方法有任何风险(可以在未来版本中删除)吗?

多谢你们!

编辑:

大概我发现问题出在哪里了......默认迭代计数为 PasswordDeriveBytes 是 100,而对于 Rfc2898DeriveBytes 是 1000。将它们更改为与 1000 相同的数字后,执行 Rfc2898DeriveBytes 只是双倍时间。

有帮助吗?

解决方案

其他提示

它们不是同一件事。

Rfc2898DeriveBytes 是 PBKDF2 的实现。PasswordDeriveBytes 是 PBKDF1 的实现。PBKDF2 使用不同的方法生成不同的输出,并且比 PBKDF1 的轮数要多得多。

诸如此类的用于密钥派生的密码散列函数应该很慢。这就是重点——这使得它们更难破解。

这两个函数不兼容,并且PasswordDeriveBytes 不太安全。

我认为您错过了 derivebytes 的要点。应该是很慢的。它故意使用缓慢的算法,无法通过巧妙的技巧来加速。典型的“迭代次数”参数应在 2^16-2^20 范围内,并在用户输入密码和生成密钥之间引入 0.1-0.5 秒的延迟。目的是防御“懒惰无知的用户”选择的弱密码并减慢暴力搜索的速度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top