我正在开发基于从 SymmetricAlgorithm 继承的类(例如 TripleDes、DES 等)的加密功能。
基本上有两个选项可以为我的算法类生成一致的密钥和 IV,PasswordDeriveBytes
and Rfc2898DeriveBytes
,两者都继承自 DeriveBytes 抽象类。
The PasswordDeriveBytes.GetBytes()
该方法在 .NET 框架中被标记为已过时,而建议使用 Rfc2898DeriveBytes.GetBytes(),因为它符合 PBKDF2 标准。但是,根据我的测试,调用相同的GetBytes()
Rfc2898DeriveBytes 类中的方法几乎比 Rfc2898DeriveBytes 类中的方法慢 15 倍PasswordDeriveBytes
类,这会导致意外的 CPU 使用率(始终高于 50%)。
以下是一些测试数据:
- 迭代次数:100
- 算法类型:DES
- 原文:“我是测试密钥,请加密我”
- Time:
- 密码衍生字节:99ms
- Rfc2898DeriveBytes:1,373ms
根据测试,性能较差Rfc2898DeriveBytes
在生产环境中是不可接受的。
以前有人注意到这个问题吗?有什么解决方案可以让我仍然使用标准解决方案而不影响性能?使用过时的方法有任何风险(可以在未来版本中删除)吗?
多谢你们!
Edit:
可能我找到了问题所在......默认迭代计数PasswordDeriveBytes
是 100,而对于Rfc2898DeriveBytes
是1000。我将它们更改为与1000相同的数字后,执行Rfc2898DeriveBytes
只是双倍时间。
它们不是同一件事。
Rfc2898DeriveBytes 是 PBKDF2 的实现。 PasswordDeriveBytes 是 PBKDF1 的实现。 PBKDF2 使用不同的方法生成不同的输出,并且比 PBKDF1 的轮数要多得多。
诸如此类的用于密钥派生的密码散列函数应该很慢。这就是重点——这使得它们更难破解。
这两个函数不兼容,并且PasswordDeriveBytes 不太安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)