KeyDerivation.Pbkdf2 和 Rfc2898DeriveBytes 有什么区别?

Sup*_*Bob 5 c# security hash .net-core

MSDN中的密钥推导:

使用 PBKDF2 算法执行密钥派生。

MSDN 中的 Rfc2898DeriveBytes:

通过使用基于 HMACSHA1 的伪随机数生成器,实现基于密码的密钥派生功能 PBKDF2。

这些不是一样的东西吗?我们可以在这两种方法中设置哈希算法。

Sup*_*Bob 1

这两个函数执行相同的操作(当两者使用相同的参数时,它们会生成相同的加密密钥)。

它们设计上的唯一区别是,Rfc2898DeriveBytes提供了更多的加密算法,而KeyDerivation提供的加密算法则较少,而且还是一个需要下载的包。(仅预装在 ASP.NET/ASP.NET Core 中,除非我弄错了。)

从性能角度来看(基准是我自己的),在某一点上KeyDerivation速度要快得多,尤其是在SHA-1计算中,但在连续测试 10 到 15 分钟后,它们似乎趋于平衡,所以我不能真正说出哪个是更高效。我可以说的是,您需要对 进行额外的分配Rfc2898DeriveBytes,您可以立即处置它,或者在应用程序的整个生命周期中重复使用它,而KeyDerivation在使用时不需要任何仪式。当然,这是以其有限的算法为代价的。

如果您不断地处置并实例一个新的Rfc2898DeriveBytes(不重复使用,90% 的情况是由于无法更改提供的密码),我相信KeyDerivation速度会快得多。(我的基准测试显示速度下降了 50%。)