.net - PasswordDeriveBytes 与 Rfc2898DeriveBytes,已过时但速度更快

标签 .net cryptography rfc2898 pbkdf2

我正在研究基于从 SymmetricAlgorithm 继承的类(例如 TripleDes、DES 等)的加密功能。

基本上有两个选项可以为我的算法类生成一致的 key 和 IV,PasswordDeriveBytesRfc2898DeriveBytes , 都继承自 DeriveBytes 抽象类。
PasswordDeriveBytes.GetBytes()方法在 .NET 框架中被标记为过时,而推荐使用 Rfc2898DeriveBytes.GetBytes(),因为它符合 PBKDF2 标准。但是,根据我的测试,调用相同的 GetBytes() Rfc2898DeriveBytes 类中的方法几乎比 PasswordDeriveBytes 中的方法慢 15 倍类,这会导致意外的 CPU 使用率(总是高于 50%)。

以下是一些测试数据:

  • 迭代次数:100
  • 算法类型:DES
  • 原文:“我是测试 key ,请给我加密”
  • 时间:
  • PasswordDeriveBytes:99 毫秒
  • Rfc2898DeriveBytes:1,373ms

  • 根据测试,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/

    相关文章:

    c# - 在 WinForms 中使用已编译的 WPF 控件(dll)?

    c# - 项目中文件夹的程序集引用

    iphone - 保护在 iPhone 上访问的 RESTful API 的最佳方法是什么

    java - 将 .Net 解密转换为 Java

    c# - UnhandledExceptionEventArgs 的全局异常处理程序不起作用

    c# - 从 asp.net 打开任何文件

    c# - Java 等同于 C# 的 Rfc2898DerivedBytes

    c# - 通过 Rfc2898DeriveBytes 的密码哈希 - 传递给 getBytes 的内容

    ssl - 非RSA TLS1.2数据包解密

    c - 如何使用用户密码进行 aes 加密?