【问题标题】:What is the most secure hashing algorithm in the .NET framework?.NET 框架中最安全的散列算法是什么?
【发布时间】:2010-09-19 13:11:53
【问题描述】:

生成的哈希大小和算法的速度并不重要。我真的只对它是最安全的选择感兴趣。我也不想使用任何第三方库。

我使用的 .NET 框架的版本如果 3.5 有什么不同的话。

【问题讨论】:

    标签: .net security encryption hash


    【解决方案1】:

    我认为SHA512 是内置哈希算法的最佳选择。它是一种非常安全的算法的最大散列形式。

    另外,不要忘记使用盐来帮助保护哈希免受dictionary attacks 的影响。

    【讨论】:

    • 在回答时 SHA512 可能就足够了 - 但现在任何关于 .Net 中安全散列的讨论都需要考虑 PBKDF2(.Net 支持)。
    • @Keith 自 08 年以来没有任何变化。 SHA512 仍然是 .net 中最强的加密哈希。它不是,也从来不是密码哈希。几十年来,密码散列需要专门的结构,如 PBKDF2 或 bcrypt。
    • @CodesInChaos 很公平 - 我认为最近发生的变化是 SHA512 直接用作密码哈希并用 100 美元的云时间拆开的高调暴力破解的数量 - 这些结构是这不是什么新鲜事,但让人们侥幸逃脱的自满情绪现在更容易被发现。
    【解决方案2】:

    您说算法的速度并不重要,但实际上它很重要。

    很大程度上取决于“安全”的定义,SHA512(几乎)不可能逆转,但实际上是fairly easy to brute force attack it

    这是因为它快速 - 您可以将其视为 SHA“家族”的基本设计缺陷,因为它们的设计速度非常快。

    这是一个问题 - SHA512 实现了它的设计目标,即非常快(它并不比 SHA1 慢多少),但如果你是一个尝试暴力破解密码的黑客,那么它更容易被破解。 10 甚至 5 年前,严重的暴力攻击是不可能的,现在是几个花哨的显卡或一些云时间。

    这就是密钥扩展算法的用武之地——它们使构建密码哈希的过程故意变慢。速度很慢,以至于用户检查单个哈希不会注意到,但暴力攻击会花费太长时间。

    密钥扩展算法的一个很好的例子是 RFC2898 或 PBKDF2 - 它使用长盐并执行 SHA 算法数千次来创建一个复制速度很慢的哈希。

    .Net 有一个本机实现:Rfc2898DeriveBytes

    他们将其用于System.Web.Crypto.HashPassword,但您可以轻松地将review their source 用于其他地方。

    现在在我的机器上(一台相当垃圾的旧笔记本电脑)一个 .Net Rfc2898DeriveBytes 哈希值 1000 次迭代(默认值)大约需要 50 毫秒,而我可以在一秒钟内暴力破解大约 250,000 个 SHA512 哈希值。

    所以现在在 .Net 中最安全的选择是使用Rfc2898DeriveBytes

    但是 RFC2898/PBKDF2 确实有一个弱点 - 虽然速度很慢,但并行计算越来越便宜,而且构建每个哈希不需要太多内存。现在它是相当不暴力的,但在 5 或 10 年后?

    因此下一代算法是像bcrypt/scrypt 这样的算法,旨在为每个哈希使用大量内存,从而使并行执行变得昂贵。虽然有 .Net 实现,但还没有一个原生的实现,我会小心使用一个,直到有 - 使用这些会影响并发登录(如果用于密码)等负载,因此引入早期采用者的风险很大。

    【讨论】:

      【解决方案3】:

      用户询问.NET 中什么是最安全的散列算法,PBKDF2 不是散列算法,它是一种派生加密密钥的方法,是的,底层伪随机函数可能是散列算法,但在 Rfc2898DeriveBytes 中它实际上是 HMACSHA1 x 与每次传递的每个哈希值的每个字节进行异或与下一次传递(称为键拉伸)。

      所以要回答目前的问题,HMACSHA512 是目前 .NET 中最安全的哈希算法。

      如果您希望“散列”密码,(我说散列是因为它不是直接散列函数输出)这里有一个 API,它采用 PBKDF2 并使用 HMACSHA512 来导出字节,而不是使用 HMACSHA1 实现的 Rfc2898DeriveBytes MS:@ 987654321@

      【讨论】:

        猜你喜欢
        • 2019-07-04
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 2018-11-04
        • 2010-10-30
        • 2011-01-20
        • 2021-03-26
        • 1970-01-01
        相关资源
        最近更新 更多