18

我正在研究基于从 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时间只有两倍。

4

3 回答 3

27

他们不是一回事。

Rfc2898DeriveBytes 是 PBKDF2 的实现。PasswordDeriveBytes 是 PBKDF1 的实现。与 PBKDF1 相比,PBKDF2 使用不同的方法和更多的轮数生成不同的输出。

用于密钥派生的密码散列函数(例如这些)应该很慢。这就是重点——这让它们更难破解。

这两个函数不兼容,而且 PasswordDeriveBytes 几乎没有那么安全。

于 2009-08-31T11:14:41.537 回答
11

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

于 2012-02-01T19:24:56.300 回答
10

这篇博文讨论了两者之间的区别:http: //blogs.msdn.com/shawnfa/archive/2004/04/14/generating-a-key-from-a-password.aspx

于 2009-08-31T11:07:22.177 回答