【问题标题】:Hashing Passwords With ASP.NET MVC 3使用 ASP.NET MVC 3 散列密码
【发布时间】:2011-06-18 15:08:10
【问题描述】:

我现在正在尝试找出散列我的 ASP.NET MVC 3 应用程序密码的最佳方法。据我所知,最好使用给定的密码和随机盐,然后将散列密码和盐存储在一起。我的问题是这不会使随机盐毫无意义吗?我的意思是散列密码的原因是因为如果有人进入您的数据库,他们没有普通密码,并且盐使反转散列以获取密码变得更加困难,但是如果我将散列与密码,salt 的意义何在(我对散列的了解非常有限,所以我的想法可能完全脱离实际)。

我的第二个问题是最好使用哪种散列方法?我读到 MD5(这是我一直使用的)很容易破解。我听说 bcrypt/sha512 很不错。应该使用哪一个?我知道默认情况下 C# 带有 sha512 散列。据我所知,.NET 库中不包含 bcrypt,有没有 C# 和 bcrypt 的好库?

【问题讨论】:

    标签: c# asp.net-mvc-3 passwords hash password-protection


    【解决方案1】:

    无需将盐存储在不同的位置,您应该始终假设攻击者知道盐,并且其目的不是作为额外的密码!!!

    在 .NET 中,此 API 将满足您的所有需求,它会在每次 AES 加密通过之前通过字节交换创建大的加密随机盐以及 HMACSHA512 散列和密钥拉伸 :)

    http://sourceforge.net/projects/pwdtknet/

    【讨论】:

    • +1 给出了很好的答案,尤其是“你应该总是假设攻击者知道盐”。
    • 好答案。所有的盐都是为了使创建彩虹表的行为更加困难,例如,如果您为所有用户使用一种盐(或没有盐),那么要破解 1000 个密码,您只需要 1 个彩虹表。当你用密码存储随机盐时,你需要 1000 个彩虹表来破解 1000 个密码。
    【解决方案2】:

    加盐会增加对彩虹/字典攻击的抵抗力。今年发生的一些安全漏洞是因为 Web 应用程序的数据库包含没有加盐的密码,并且是使用 md5 完成的。因此,一个简单的彩虹攻击可以在几秒钟内为一些使用糟糕密码的用户生成密码。

    为了使用 MVC 3 提供用户身份验证,您应该真正使用该框架来处理这类事情。如果您做得不对,提出您自己的自定义身份验证提供程序可能会导致问题。

    看看 http://msdn.microsoft.com/en-us/library/ff398049%28v=VS.98%29.aspx 和 http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx。如果您使用 .NET 会员系统,则不需要进行任何低级数据库或密码管理。您只需将 [Authorize] 标签放在需要验证和完成的控制器操作周围。

    【讨论】:

    【解决方案3】:

    这是 bcrypt 的一个不错的 C# 实现:

    http://bcrypt.codeplex.com/

    【讨论】:

      【解决方案4】:

      SHA512 是在 .net 中进行散列的一个不错的选择,如果您使用密码存储盐,它有点没有意义(但“解密”仍然需要更长的时间),但您可以将盐存储在其他地方,所以数据库是不够的:

      • 将盐存放在其他地方
      • 始终使用相同的盐,例如在代码中硬编码或保存在应用程序设置中
      • 根据一些其他信息为每个用户生成盐,例如用户 ID 的 MD5
      • 通过某些系统设置(如主机名或类似设置)为所有用户生成 salt

      更新:
      正如迈克已经说过的那样,我对上面的“毫无意义”的陈述是错误的。即使知道盐,它也会使Rainbow Table 攻击无用(或者更不可能),因此即使将盐存储在散列旁边,您也应该始终使用盐(例如,Linux 确实将用户密码存储在shadow file 形式为“$id$salt$hashed”)!

      【讨论】:

      【解决方案5】:

      我一直使用以下方法来存储密码

      public static string MD5Hash(string value)
      {
          return Convert.ToBase64String(new MD5CryptoServiceProvider().ComputeHash(new UTF8Encoding().GetBytes(value)));
      }
      

      是否可以将此类哈希恢复为原始密码,这从来都不是问题。

      【讨论】:

      • MD5 是一个非常弱的哈希值,可以使用现代 PC 相对快速地进行暴力破解。您应该阅读这篇文章:stackoverflow.com/questions/1756188/…
      • 我已经阅读了这篇文章,我可以假设 1) 如果有人将存储数据库,他/她可以在使用没有密钥的加密方法的情况下使用密码。从这个角度来看,MD5 和 SHA256 和 SHA1 具有相同的蛮力强度。 2)拥有真正强大的密码的唯一方法是使用哈希方法宽度将存储在应用程序(而不是数据库)中的密钥。那么如果数据库被盗,没有人可以暴力破解您的密码。
      【解决方案6】:

      如果他们侵入您的安全数据库以窃取人们的散列密码,那么他们此时不太可能真的需要密码。他们很可能已经可以访问数据库中的所有数据。 MD5 散列对于普通网站来说可能很好,如果它是简单的数据,没有价值。对于更可能有价值的数据,其他更困难的散列方法会很好。

      【讨论】:

        猜你喜欢
        • 2017-02-09
        • 1970-01-01
        • 2011-11-14
        • 2019-08-19
        • 2012-06-09
        • 2012-09-04
        • 1970-01-01
        • 2013-11-02
        • 2011-02-24
        相关资源
        最近更新 更多