C# e不是一个安全漏洞。

C# e不是一个安全漏洞。,c#,encryption,C#,Encryption,如果您担心冲突,请使用512位的SHA-2。再说一次,SHA-1算法还没有得到验证的冲突,因此它仍然足够安全,不必担心冲突。如果使用带有合适种子的SHA-512,则发生这种情况的可能性很小(但并非不可能) Bruce Scheiner有一些关于各种安全技术的健壮性的有趣博客- 另一个需要考虑的问题是确保两个使用相同密码的用户不会在数据库中得到相同的哈希结果 为了解决这个问题,您可以构造一个种子,其中包含特定于用户的内容,如用户表中的userid key字段。为什么多个字符串将散列为相同的密码值很

如果您担心冲突,请使用512位的SHA-2。再说一次,SHA-1算法还没有得到验证的冲突,因此它仍然足够安全,不必担心冲突。

如果使用带有合适种子的SHA-512,则发生这种情况的可能性很小(但并非不可能)

Bruce Scheiner有一些关于各种安全技术的健壮性的有趣博客-

另一个需要考虑的问题是确保两个使用相同密码的用户不会在数据库中得到相同的哈希结果


为了解决这个问题,您可以构造一个种子,其中包含特定于用户的内容,如用户表中的userid key字段。

为什么多个字符串将散列为相同的密码值很重要?每次用户输入他或她的密码时,它将散列到相同的值,这将对用户进行身份验证。输入几乎任何其他密码都几乎肯定与哈希值不匹配。如果您使用的是一个提供64位值的好的哈希函数,那么另一个密码与用户的密码匹配的几率大约是五分之一

您要防范的是内部人员复制用户密码,并在安全性被破坏和密码表被破坏时泄露实际密码。标准技术是向密码中添加一些附加位(salt,每个帐户的salt应该不同),并使用强大的哈希函数

如果这样做,很难找到一个能产生给定哈希值的密码,除非一个密码接一个密码,直到找到正确的密码。散列以这种方式提供了针对内部人员和入侵者的保护:访问密码表不足以作为其他人登录

两个用户可能拥有相同的密码,或者(尽管这极不可能)散列为相同值的密码。有了salt,它们在密码表中看起来就不一样了,因此没有入侵者或内部人员会通过查看表知道他们的密码与其他人的密码相同


另一个好处是许多人重复使用密码,特别是对于不需要安全的帐户。(我所有拥有财务信息的账户都有不同的好密码,但我在各种论坛上使用的是同一个不太强的密码。)对于salt和hash,即使使用两个密码表,也无法判断我在站点A和站点B上的密码是否相同。

哈希和加密是稍微不同的概念,尽管md5()和sha1()以及类似的函数本质上是执行哈希的加密函数。由于哈希在理论上应该为给定的输入(通常是较大的输入)提供唯一的输出,因此它本质上意味着每个哈希应该映射到单个输入-这意味着您手头上有一个完美的压缩函数,它可以将大小N通常大于M的数据减少为大小M的数据,并且该过程是可逆的。但是,在实践中会发生哈希冲突。这意味着一个散列可能映射到多个原始输入。这意味着单个密码散列可能会为您获取一个完全不同密码的用户,这是一个真正的安全问题

然而,当加密数据与原始数据有一对一的关系时,加密保证是可逆的(当然有正确的解密密钥)。如果密码长度为N,则加密密码的大小也为N。密码同样安全且无冲突

正如他们所说,如果某件事情太好而不可能是真的,那么它可能是-如果哈希可以可逆地生成原始数据,那么我们就不需要数据压缩算法-我们可以获取任意大小的数据,对其进行哈希以生成128位长的数据,并期望它在需要时返回原始数据。然而,情况并非如此。原始数据越长,哈希越不可靠,无论其长度如何


发明加密/解密密钥对,并在将用户密码存储到公共位置之前对其进行加密。

冲突确实会发生,但它们应该非常罕见,在一定时间内不太可能发生

现在大多数攻击都考虑到所使用的算法的弱点,从而使它更快地找到冲突来利用。MD5已经被证明比以前认为的要弱。从寄存器中可以看出该漏洞是如何用于创建SSL证书的

甚至更具抵抗力的算法也被证明有缺陷,使得更容易找到这些碰撞

这显示了一篇讨论SHA-1 collisons的论文,以及如何使其变得更容易。(数学重)

对于试图从散列恢复密码的人来说,出于实际目的,使用了彩虹表等工具


这考虑到人们会选择简单的密码,因此可以使用一个(常用密码列表加上许多其他术语)来计算散列并比较它们。这就是为什么总是建议使用

来最大限度地降低对多个密码进行暴力攻击的风险,您也应该对它们进行攻击;总是给它们加盐。我发现,一点胡椒粉也会增加一些味道。我只想指出,散列是单向函数,而加密意味着拥有正确密钥的人可以解密原始密码。哈希是密码检查的最佳方法,例如,你需要加密来发送安全的html。考虑到暴力攻击,如果多次失败的尝试似乎是以一种表示攻击的方式发生的,那么暂停多次失败的尝试也是一个好主意,即多次极快的登录尝试。哦,太好了,现在需要担心的是另一件事。谢谢。你必须将风险与后果相乘。如果系统管理员(或黑客)拥有与用户相同的密码,他们将看到他们的哈希值和密码是相同的,并且能够作为该用户登录。我
    public static string ComputeHash(string plaintext)
    {
        HashAlgorithm mhash = new SHA1CryptoServiceProvider();
        byte[] bytValue = Encoding.UTF8.GetBytes(plaintext);
        byte[] bytHash = mhash.ComputeHash(bytValue);
        mhash.Clear();
        return Convert.ToBase64String(bytHash);
    }
  private static string CreateSalt(int size)
  {
   //Generate a cryptographic random number.
   RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
   byte[] buff = new byte[size];
   rng.GetBytes(buff);

   // Return a Base64 string representation of the random number.
   return Convert.ToBase64String(buff);
  }

private static string CreatePasswordHash(string pwd, string salt)
  {
   string saltAndPwd = String.Concat(pwd, salt);
   string hashedPwd =
    FormsAuthentication.HashPasswordForStoringInConfigFile(
    saltAndPwd, "sha1");

   return hashedPwd;
  }