Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET:PasswordDeriveBytes和Rfc2898DeriveBytes之间的差异_C#_.net_Pbkdf2_Pkcs#5 - Fatal编程技术网

C# .NET:PasswordDeriveBytes和Rfc2898DeriveBytes之间的差异

C# .NET:PasswordDeriveBytes和Rfc2898DeriveBytes之间的差异,c#,.net,pbkdf2,pkcs#5,C#,.net,Pbkdf2,Pkcs#5,我正在试图理解一些C代码,我得到的,它涉及密码学,特别是使用System.Security.cryptography中的PasswordDeriveBytes 在中,它说PasswordDeriveBytes使用了“PBKDF1算法的扩展”,该算法在后面的文档中指定为“PKCS#5 v2.0标准”,即PBKDF2(据我所知)。然而,在我发现的网络上的任何地方(包括在Stack Exchange上),每个人都说“使用Rfc2898DeriveBytes,因为Password*已被弃用并使用PBKD

我正在试图理解一些C代码,我得到的,它涉及密码学,特别是使用
System.Security.cryptography
中的
PasswordDeriveBytes

在中,它说
PasswordDeriveBytes
使用了“PBKDF1算法的扩展”,该算法在后面的文档中指定为“PKCS#5 v2.0标准”,即PBKDF2(据我所知)。然而,在我发现的网络上的任何地方(包括在Stack Exchange上),每个人都说“使用Rfc2898DeriveBytes,因为Password*已被弃用并使用PBKDF1”。但在的文档中唯一的区别似乎是Rfc*版本特别提到了PBKDF2,其中Password*表示“PBKDF1的扩展”和“PKCS#5v2.0”

那么,有谁能告诉我这两个类(如果有的话)之间的区别是什么,以及为什么我应该使用其中一个而不是另一个来派生PBKDF2密码密钥


现在,其他处理相同数据的代码显式地使用了PBKDF2,并且工作正常,因此这表明确实
PasswordDeriveBytes
也使用了PBKDF2,或者PBKDF2在某些情况下与PBKDF1兼容,但我想确定这不是一些随机事件的副作用,而这一切只是奇迹般地工作(最终可能会奇迹般地惊人地崩溃),没有人真正理解原因。

定义了PBKDF1和PBKDF2,前者是为了向后兼容,还建议您在新应用程序中使用PBKDF2。我不知道为什么后者比前者好,但这两个.NET类似乎使用了不同但可互操作的算法。(可能是因为只交换结果密钥,而不是输入+KDF。)

这里有一篇博客文章详细介绍了这些差异:


PBKDF2可用于生成任意长度的密钥,这对于基于密码的加密非常有用(它可以根据对称密码的要求生成任意长度的密钥),但对于安全密码存储意味着更少。它还使用HMAC而不是像PBKDF1那样的串联来应用salt,PBKDF1在弱盐的情况下具有更好的安全性。

我认为这里可以找到一个很好的答案:

但总而言之:

Microsoft对原始PKCS#5(又名PBKDF1)的实现包括不安全的扩展,以提供比哈希函数所能提供的字节更多的字节(请参阅此处和此处的错误报告)

即使没有bug,也应该避免对标准进行未记录的专有扩展(或者将来可能永远无法解密数据,至少不能在Windows之外)


我强烈建议您使用实现PBKDF2(PKCS#5 v2)的较新Rfc2898DeriveBytes从.NET 2.0开始提供。

如果实例化
PasswordDeriveBytes
并对
GetBytes
方法进行一次调用,传递一个小于基础摘要算法输出大小的值,则从该算法返回一个值

如果对同一对象调用两次GetBytes,则在实现中可能会遇到计数错误

PBKDF1仅用于输出哈希算法的大小(例如,SHA-1为20字节),但PasswordDeriveBytes类已建立了一个公式,支持多达1000倍的哈希输出大小。因此,在另一个平台上,这个类产生的巨大价值可能不容易实现


如果实例化
Rfc2898DeriveBytes
,则会得到该算法的流式实现。PBKDF2与PBKDF1最明显的区别在于PBKDF2允许生成任意数量的数据(限制为
(2^32-1)*hashOutputSize
;或SHA-1 85899345900字节)。PBKDF2还使用更复杂的构造(特别是直接摘要上的HMAC),使得从输出值恢复输入密码更加困难

实现中的“流”是
GetBytes(5)
GetBytes(3)
的串联与
GetBytes(8)
相同。与PasswordDeriveBytes不同,它在Rfc2898DeriveBytes中正常工作


PBKDF1最初是为了生成DES密钥而创建的,于1993年发布。
PBKDF2于1999年在PKCS#5 v2.0中发表(作为第二版重新发布)。应在(但似乎有问题,所以可能需要做)找到的幻灯片进一步总结了差异。(幻灯片由RSA Security编写,RSA Security是PBKDF1和PBKDF2的创建者,他们是推荐PBKDF2而不是PBKDF1的人)。

是的,我不是问1和2之间的区别,而是问两个特定.NET类之间的区别。:)其中一个实现1,而另一个实现2:)那么什么是“扩展”?不一定,您仍然可以包括输出数据使用的加密方案/KDF,并且您提到的“其他代码”是在确定加密方案使用PBKDF2后使用的代码路径。不能仅仅从“显式使用PBKDF2”来判断。