使用ASP.NET MVC 3散列密码

| 我现在正在尝试找出对ASP.NET MVC 3应用程序的密码进行哈希处理的最佳方法。据我所知,最好使用给定的密码和随机盐,然后将散列的密码和盐存储在一起。我的问题是,这是否会使随机盐毫无意义?我的意思是对密码进行哈希处理的原因是,如果有人进入您的数据库,他们将没有普通密码,并且加盐会使反向哈希以获取密码变得更加困难,但是如果我将哈希存储为密码,盐的含义是什么(我对哈希的知识非常有限,因此我可能会完全不了解自己的想法)。 我的第二个问题是,最好使用哪种哈希方法?我读到MD5(这是我一直使用的)很容易破解。我听说bcrypt / sha512很好。应该使用哪一个?我知道默认情况下,C#随sha512哈希一起提供。从我的看到,.NET库中不包含bcrypt,对于C#和bcrypt有没有好的库?     
已邀请:
        无需将盐储存在其他位置,无论如何,您始终应该假定盐已被攻击者知道,并且其目的不是成为多余的密码! 在.NET中,此API将满足您的所有需求,它将在每次AES加密通过之前通过字节交换创建较大的加密随机盐以及HMACSHA512哈希和密钥扩展:) http://sourceforge.net/projects/pwdtknet/     
        盐腌会增加抵抗彩虹/字典攻击的能力。今年发生的一些安全漏洞利用是因为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]标记放在需要进行身份验证和完成的控制器动作周围即可。     
        这是bcrypt的一个不错的C#实现: http://bcrypt.codeplex.com/     
        SHA512是在.net中进行散列的一个不错的选择,如果您使用密码存储盐,则它毫无意义(但是\“解密\”仍需要更长的时间),但是您可以将盐存储在其他地方,因此数据库不足: 将盐储存在其他地方 始终使用相同的盐,例如在代码中对其进行硬编码或将其保存在应用设置中 根据其他信息为每个用户生成盐用户ID的MD5 通过某些系统设置(例如主机名或类似名称)为所有用户生成盐 更新: 正如Mike所说,我对上面的“毫无意义”的陈述是错误的。即使知道盐,它也会使Rainbow Table Attacks无效(或更不可能),因此即使将盐存储在哈希旁边也应始终使用盐(例如,Linux确实将用户密码存储在阴影中)文件以\“ $ id $ salt $ hashed \”的形式)!     
        我一直使用以下方法来存储密码
public static string MD5Hash(string value)
{
    return Convert.ToBase64String(new MD5CryptoServiceProvider().ComputeHash(new UTF8Encoding().GetBytes(value)));
}
能否将这样的哈希值恢复为原始密码从来都不是问题。     
        如果他们入侵您的安全数据库以窃取用户的哈希密码,那么那时他们不太可能真的需要密码。他们很可能已经可以访问数据库中的所有数据。如果MD5哈希值很简单,而数据却没有价值,那么它对于一般的网站来说可能不错。对于更可能有价值的数据,其他更困难的哈希方法会很好。     

要回复问题请先登录注册