我正在开发一个基于从SymmetricAlgorithm继承的类的加密功能,比如TripleDes、DES等。
基本上,有两个选项可以为我的算法类PasswordDeriveBytes和Rfc2898DeriveBytes生成一致的键和IV,这两个类都继承自DeriveBytes抽象类。
在.NET框架中,PasswordDeriveBytes.GetBytes()方法被标记为过时,而推荐使用Rfc2898DeriveBytes.GetBytes(),因为它符合PBKDF2标准。然而,根据我的测试,在Rfc2898DeriveBytes类中调用相同的GetBytes()方法几乎比在PasswordDeriveBytes类中慢15倍,这导致意外的CPU使用率(总是高于50%)。
以下是一些测试数据:
根据测试结果,Rfc2898DeriveBytes在生产环境中的性能是不可接受的。
以前有没有人注意到这个问题?有没有什么解决方案可以在不影响性能的情况下使用标准的解决方案?使用过时的方法(可能在未来的版本中删除)有任何风险吗?
谢谢你们!
编辑:
也许我找到问题所在了..。PasswordDeriveBytes的默认迭代计数为100,而Rfc2898DeriveBytes的默认迭代计数为1000。在我将它们更改为与1000相同的数字后,执行Rfc2898DeriveBytes的时间仅为原来的两倍。
发布于 2009-08-31 11:07:22
发布于 2009-08-31 11:14:42
它们不是一回事。
Rfc2898DeriveBytes是PBKDF2的一种实现。PasswordDeriveBytes是PBKDF1的一种实现。与PBKDF1相比,PBKDF2使用不同的方法和更多的轮数生成不同的输出。
用于密钥派生的口令散列函数,如这些函数,应该是很慢的。这就是问题的关键--这使得破解它们变得更加困难。
这两个函数不兼容,而且PasswordDeriveBytes的安全性也不高。
发布于 2012-02-02 03:24:56
我认为你错过了派生字节的要点。它应该是很慢的。它故意使用缓慢的算法,这是巧妙的技巧无法加速的。典型的“迭代次数”参数应该在2^16-2^20范围内,并在用户输入密码和生成密钥之间引入0.1-0.5秒的延迟。其目的是防御“懒惰的无知用户”选择的弱密码,并放慢暴力搜索的速度。
https://stackoverflow.com/questions/1356899
复制相似问题