我正在研究基于从 SymmetricAlgorithm 继承的类(例如 TripleDes、DES 等)的加密功能。
基本上有两个选项可以为我的算法类生成一致的 key 和 IV,PasswordDeriveBytes
和 Rfc2898DeriveBytes
, 都继承自 DeriveBytes 抽象类。PasswordDeriveBytes.GetBytes()
方法在 .NET 框架中被标记为过时,而推荐使用 Rfc2898DeriveBytes.GetBytes(),因为它符合 PBKDF2 标准。但是,根据我的测试,调用相同的 GetBytes()
Rfc2898DeriveBytes 类中的方法几乎比 PasswordDeriveBytes
中的方法慢 15 倍类,这会导致意外的 CPU 使用率(总是高于 50%)。
以下是一些测试数据:
根据测试,
Rfc2898DeriveBytes
的性能不佳在生产环境中是 Not Acceptable 。以前有没有人注意到这个问题?任何解决方案我仍然可以使用标准解决方案而不会影响性能?使用过时的方法有任何风险(可以在 future 的版本中删除)?
多谢你们!
编辑:
可能我发现问题出在哪里...
PasswordDeriveBytes
的默认迭代计数是 100,而对于 Rfc2898DeriveBytes
是1000。我把它们改成和1000一样的数字后,执行Rfc2898DeriveBytes
只是双倍时间。
最佳答案
他们不是一回事。
Rfc2898DeriveBytes 是 PBKDF2 的实现。 PasswordDeriveBytes 是 PBKDF1 的实现。与 PBKDF1 相比,PBKDF2 使用不同的方法和更多的轮数生成不同的输出。
用于 key 派生的密码散列函数(例如这些)应该很慢。这就是重点——这让它们更难破解。
这两个函数不兼容,而且 PasswordDeriveBytes 几乎没有那么安全。
关于.net - PasswordDeriveBytes 与 Rfc2898DeriveBytes,已过时但速度更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1356899/