【发布时间】:2010-11-24 07:43:13
【问题描述】:
我正在开发基于继承自 SymmetricAlgorithm 的类(例如 TripleDes、DES 等)的加密功能。
基本上有两个选项可以为我的算法类PasswordDeriveBytes 和Rfc2898DeriveBytes 生成一致的密钥和IV,它们都继承自DeriveBytes 抽象类。
PasswordDeriveBytes.GetBytes() 方法在 .NET 框架中被标记为已过时,而推荐使用 Rfc2898DeriveBytes.GetBytes(),因为它符合 PBKDF2 标准。但是,根据我的测试,在 Rfc2898DeriveBytes 类中调用相同的 GetBytes() 方法几乎比在 PasswordDeriveBytes 类中慢 15 倍,这会导致意外的 CPU 使用率(总是高于 50%)。
以下是一些测试数据:
- 迭代次数:100
- 算法类型:DES
- 原文:“我是测试密钥,请给我加密”
- 时间:
- PasswordDeriveBytes:99 毫秒
- Rfc2898DeriveBytes:1,373 毫秒
经测试,Rfc2898DeriveBytes 的不良性能在生产环境中是不能接受的。
以前有人注意到这个问题吗?任何解决方案我仍然可以使用标准解决方案而不会影响性能?使用过时的方法是否有风险(可能在未来的版本中删除)?
谢谢大家!
编辑:
可能我发现问题出在哪里...PasswordDeriveBytes 的默认迭代计数为 100,而Rfc2898DeriveBytes 的默认迭代计数为 1000。我将它们更改为与 1000 相同的数字后,执行 Rfc2898DeriveBytes 仅双倍时间。
【问题讨论】:
-
您打算多久在生产环境中派生一次密钥?而且,关于您的计时数据,当您说“100 次迭代”时 - 是对 onee 键的迭代,还是您生成了 100 个键。任何基于 100 次试验的性能数据都是可疑的,但我认为您实际上测试了 ONE 试验。与所有性能分析案例一样,根据单个试验的响应时间得出有关服务器性能的结论是不合适的。
-
@Cheeso 该测试只是对这两个类的性能的单元测试,并没有在真实的应用程序中完成。我提到的“100 次迭代”有点令人困惑,这仅意味着我将它们中的每一个都执行了 100 次。这不是真正的性能测试,而只是比较。
-
我认为您可能错过了
Rfc2898DeriveBytes的基本原理设计 速度较慢,因此密码哈希检查(每次登录时进行,因此很少进行)不会'在蛮力攻击时注意到性能受到影响。如果您需要生成大量哈希,Rfc2898DeriveBytes不适合您,但如果您需要一些安全性以防止暴力攻击,那么它是。 -
虽然大家一致认为
Rfc2898DeriveByes的设计速度较慢,但我很难相信您的性能测试的可靠性。简单地迭代一段代码一百次肯定不是进行可靠微基准测试的正确方法。
标签: .net cryptography rfc2898 pbkdf2