删除...现在堆栈溢出只是垃圾,没有帮助只是混蛋
大于本机大小(SHA-1 为 20 字节)的哈希大小会降低防御者的性能,但不会降低攻击者的性能。由于这意味着您可以承担更少的迭代,因此它实际上削弱了安全性。
例如,以与 3000 次迭代的 1024 字节哈希相同的成本,您可以负担得起 156000 次迭代的 20 字节哈希,这比破解成本高出 52 倍。
要使用 SHA-2,您需要完全不同的 PBKDF2 实现,.net 中包含的实现被硬编码为使用 SHA-1。
如果您费心使用第三方库,我宁愿使用 bcrypt 库,因为它对于基于 GPU 的攻击者来说要强大得多。
您的 API 使用起来很尴尬,因为您将盐管理推给调用者,而不是在
Create
/Verify
函数中处理它。使用
SecureString
然后将其转换为String
是愚蠢的。这抵消了首先使用 SecureString
的全部意义。
就我个人而言,我不会在典型的应用程序中使用
SecureString
。只有将其与广泛的全栈安全审查结合起来才有价值,该审查会检查密码是否永远不会存储在 String
中,并且一旦不再需要,总是从可变存储中删除。我不会将密码/盐存储在实例变量中。只需将它们保留在相关功能的本地即可。我只会将配置存储在实例变量中(例如迭代计数)。
虽然 SHA-1 在密码学上被削弱,但攻击会产生冲突。由于密码哈希冲突无关紧要,您首先关心的是原像攻击。 SHA-1 在这方面仍然相当强大。
SHA-512 的主要优点不是它的加密性更强(尽管确实如此),而是 64 位算术使攻击者比防御者付出更多的代价,因为防御者可能会使用提供快速 64 位算术的 64 位 Intel CPU .
如果有人通过搜索遇到这个问题,现在微软提供了 Microsoft.AspNetCore.Cryptography.KeyDerivation NuGet 包,它允许将 PBKDF2 与 SHA-256 和 SHA-512 哈希函数一起使用。文档可在 learn.microsoft.com 获取。
回答问题:从“SecurityDriven.NET”书中下载免费代码示例。找到采用 HMAC 工厂的 PBKDF2 类。 HMACSHA512 工厂可用等。
由于您是密码学新手,我也强烈建议您阅读这本书(例如,充分理解 CodesInChaos 提出的观点)。
对于那些通过搜索找到此内容的人,答案是
Rfc2898DeriveBytes
构造函数将哈希算法作为参数,而 HashAlgorithmName.SHA512
是一个受支持的选项。 所以,这有效:
var pbkdf2 = new Rfc2898DeriveBytes(passwordBytes, bytesSalt, 1000000, HashAlgorithmName.SHA512);