我正在尝试了解一些处理密码学的C#代码,特别是使用了PasswordDeriveBytes
中的System.Security.Cryptography
。
在.NET docs中,它说PasswordDeriveBytes
使用“PBKDF1算法的扩展”,该文件稍后在指定为“PKCS#5 v2.0标准”的文档中被称为PBKDF2(据我所知)。但是,我在网上发现的所有地方(包括Stack Exchange上的地方)都说“使用Rfc2898DeriveBytes,导致不建议使用密码*并使用PBKDF1”。但是msdn.microsoft.com中文档的唯一区别似乎是Rfc *版本专门提到PBKDF2,其中Password *表示“PBKDF1的扩展”和“PKCS#5 v 2.0”。
那么,谁能告诉我这两个类(如果有)之间的区别是什么,为什么我应该使用一个而不是另一个来进行PBKDF2密码 key 派生?
现在,处理相同数据的其他代码明确使用PBKDF2并起作用,因此这表明PasswordDeriveBytes
实际上也使用PBKDF2,或者PBKDF2在某些情况下仅与PBKDF1兼容,但是我想确定一点这不是某些随机事物的副作用,并且事物只是在没有任何人真正理解其原因的情况下可以神奇地起作用(并且最终可能会神奇地断开)。
最佳答案
如果实例化PasswordDeriveBytes
并通过传递小于基础摘要算法输出大小的值来调用GetBytes
方法,则可以从PBKDF1算法中获取一个值。
如果您为同一对象两次调用GetBytes,则在实现中可能会遇到计数错误。
PBKDF1仅描述为输出最大散列算法的大小(例如SHA-1为20字节),但是PasswordDeriveBytes类已组成一个公式,可支持最大散列输出大小的1000倍。因此,在另一个平台上可能很难获得此类所产生的巨大值(value)。
如果实例化Rfc2898DeriveBytes
,您将获得PBKDF2算法的流式实现。 PBKDF2与PBKDF1的最明显区别是PBKDF2允许生成任意数量的数据(限制为(2^32-1)*hashOutputSize
;或SHA-1 85,899,345,900字节)。 PBKDF2还使用更复杂的结构(特别是通过直接摘要的HMAC)使从输出值恢复输入密码更加困难。
实现中的“流式传输”是GetBytes(5)
和GetBytes(3)
的串联与GetBytes(8)
相同。与PasswordDeriveBytes不同,这在Rfc2898DeriveBytes中可以正常工作。
PBKDF1最初是为了生成DES key 而创建的,于1993年在PKCS #5 v1.5中发布。
PBKDF2于1999年在PKCS#5 v2.0中发布(重新发布为RFC2898)。应在ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf上找到一个幻灯片平台(但似乎有问题,所以ftp://ftp.dfn-cert.de/pub/pca/docs/PKCS/ftp.rsa.com/99workshop/pkcs5_v2.0.ppt可能要做)进一步总结了差异。 (幻灯片是由PBKDF1和PBKDF2的创建者RSA Security编写的,他们是推荐PBKDF2而不是PBKDF1的人。)
关于c# - .NET:PasswordDeriveBytes和Rfc2898DeriveBytes之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7092977/