我正在尝试理解一些 C# 代码,我已经掌握了它,它处理密码学,特别是使用 System.Security.Cryptography 中的 PasswordDeriveBytes。
在.NET docs ,它说 PasswordDeriveBytes 使用“PBKDF1 算法的扩展”,稍后在文档中指定为“PKCS#5 v2.0 标准”,即 PBKDF2(据我所知).不过,我发现在网上的任何地方(包括 Stack Exchange 上的此处),每个人都说“使用 Rfc2898DeriveBytes,因为 Password* 已被弃用并使用 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 over direct digest)来使从输出值中恢复输入密码变得更加困难。
实现中的“流”是GetBytes(5)和GetBytes(3)的拼接与GetBytes(8)。与 PasswordDeriveBytes 不同,这在 Rfc2898DeriveBytes 中可以正常工作。
PBKDF1 最初是为了生成 DES key 而创建的,发表于 PKCS #5 v1.5 1993年。 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/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur