已删除423643574756

问题描述 投票:0回答:4

删除...现在堆栈溢出只是垃圾,没有帮助只是混蛋

text
4个回答
12
投票
  1. 3000 次迭代是相当低的。即使10000也很低。但是,您需要权衡额外迭代的安全增益与攻击者通过尝试频繁登录来攻击您的服务器的风险,这会为每次尝试触发昂贵的哈希值。
  2. 大于 128 位/16 字节的盐是没有意义的。盐应该是唯一的,仅此而已。
  3. 大于本机大小(SHA-1 为 20 字节)的哈希大小会降低防御者的性能,但不会降低攻击者的性能。由于这意味着您可以承担更少的迭代,因此它实际上削弱了安全性。

    例如,以与 3000 次迭代的 1024 字节哈希相同的成本,您可以负担得起 156000 次迭代的 20 字节哈希,这比破解成本高出 52 倍。

  4. 要使用 SHA-2,您需要完全不同的 PBKDF2 实现,.net 中包含的实现被硬编码为使用 SHA-1。

    如果您费心使用第三方库,我宁愿使用 bcrypt 库,因为它对于基于 GPU 的攻击者来说要强大得多。

  5. 您的 API 使用起来很尴尬,因为您将盐管理推给调用者,而不是在

    Create
    /
    Verify
    函数中处理它。

  6. 使用

    SecureString
    然后将其转换为
    String
    是愚蠢的。这抵消了首先使用
    SecureString
    的全部意义。

    就我个人而言,我不会在典型的应用程序中使用

    SecureString
    。只有将其与广泛的全栈安全审查结合起来才有价值,该审查会检查密码是否永远不会存储在
    String
    中,并且一旦不再需要,总是从可变存储中删除。

  7. 我不会将密码/盐存储在实例变量中。只需将它们保留在相关功能的本地即可。我只会将配置存储在实例变量中(例如迭代计数)。

  8. 虽然 SHA-1 在密码学上被削弱,但攻击会产生冲突。由于密码哈希冲突无关紧要,您首先关心的是原像攻击。 SHA-1 在这方面仍然相当强大。

    SHA-512 的主要优点不是它的加密性更强(尽管确实如此),而是 64 位算术使攻击者比防御者付出更多的代价,因为防御者可能会使用提供快速 64 位算术的 64 位 Intel CPU .


8
投票

如果有人通过搜索遇到这个问题,现在微软提供了 Microsoft.AspNetCore.Cryptography.KeyDerivation NuGet 包,它允许将 PBKDF2 与 SHA-256 和 SHA-512 哈希函数一起使用。文档可在 learn.microsoft.com 获取。


6
投票

回答问题:从“SecurityDriven.NET”书中下载免费代码示例。找到采用 HMAC 工厂的 PBKDF2 类。 HMACSHA512 工厂可用等。

由于您是密码学新手,我也强烈建议您阅读这本书(例如,充分理解 CodesInChaos 提出的观点)。


2
投票

对于那些通过搜索找到此内容的人,答案是

Rfc2898DeriveBytes
构造函数将哈希算法作为参数,而
HashAlgorithmName.SHA512
是一个受支持的选项。 所以,这有效:

var pbkdf2 = new Rfc2898DeriveBytes(passwordBytes, bytesSalt, 1000000, HashAlgorithmName.SHA512);
© www.soinside.com 2019 - 2024. All rights reserved.