我正在研究基于从 SymmetricAlgorithm 继承的类(例如 TripleDes、DES 等)的加密功能。
基本上有两个选项可以为我的算法类生成一致的密钥和 IV,PasswordDeriveBytes
并且Rfc2898DeriveBytes
都继承自 DeriveBytes 抽象类。
该PasswordDeriveBytes.GetBytes()
方法在 .NET 框架中被标记为过时,而推荐使用 Rfc2898DeriveBytes.GetBytes(),因为它符合 PBKDF2 标准。但是,根据我的测试,GetBytes()
在 Rfc2898DeriveBytes 类中调用相同的方法几乎比在PasswordDeriveBytes
类中慢 15 倍,这导致了意外的 CPU 使用率(总是高于 50%)。
以下是一些测试数据:
- 迭代次数:100
- 算法类型:DES
- 原文:“我是测试密钥,请给我加密”
- 时间:
- PasswordDeriveBytes:99 毫秒
- Rfc2898DeriveBytes:1,373 毫秒
根据测试,Rfc2898DeriveBytes
生产环境中的不良性能是不能接受的。
以前有没有人注意到这个问题?任何解决方案我仍然可以使用标准解决方案而不会影响性能?使用过时的方法有任何风险(可以在未来的版本中删除)?
多谢你们!
编辑:
可能我发现问题出在哪里了……默认的迭代计数PasswordDeriveBytes
是100,而forRfc2898DeriveBytes
是1000。在我将它们更改为与1000相同的数字后,执行Rfc2898DeriveBytes
时间只有两倍。