【问题标题】:Encrypt password C#加密密码 C#
【发布时间】:2010-08-05 19:55:14
【问题描述】:

我正在我的网站中实现用户帐户。我需要加密新成员的密码,但是我发现有许多选项可以实现这一点,我对此感到很疯狂。

对称和非对称密码系统、公钥与私钥、数字签名、哈希算法、RSA、DES、Rijndael、PGP、MD5、SHA-1、https、安全套接字、Camellia、IDEA;这是什么意思呢?

我什至不知道 MD5 和 rinjdael 之间的区别,有人能告诉我加密的最佳选择吗?

【问题讨论】:

标签: c# encryption


【解决方案1】:

如果您使用的是 asp.net,则可以使用内置的用户帐户功能。

如果你坚持自己构建,你不应该加密,你应该散列并且只存储散列,而不是实际密码。

这里有一个link 可以帮助您入门。

评论更新
membership providers for MySql
membership providers for Oracle

【讨论】:

  • 我很久以前就已经看到了。这次我不想使用 ASP.NET 帐户功能,因为我将使用 MYSQL 和 ORACLE
  • 我为您提到的 dbms 添加了会员提供商的链接。
  • 我真的很感谢你的帮助,但无论如何我都不会使用 ASP.NET 功能。感谢你的帮助
  • @ozsenegal:你做错了。您应该使用现成的、经过验证的代码,而不是自己动手。如果您坚持自己做,请宣传您的网站使用未经证实的安全性,由不知道一个哈希值与另一个哈希值的开发人员编写的事实。你至少欠你的用户那么多。或者只是听从卢卡斯的建议,不要重新发明轮子。
【解决方案2】:

What is the easiest way to encrypt a password when I save it to the registry?

你没有加密你散列的密码,查看类似问题的链接

【讨论】:

    【解决方案3】:

    您不应加密密码,而应使用盐(以防止彩虹表)和 SHA-256 或更好的方法对其进行哈希处理。这意味着您不必保留密钥并担心密钥管理的负载,也意味着没有人(包括您自己)可以从数据库中的数据中找到用户密码(他们只能确认他们拥有猜对了密码)。

    还建议您使用大量(1000+)次哈希迭代以使其计算速度变慢(对于输入正确密码的用户来说不会太慢,但如果您正在散列大量单词,则速度太慢查看是否有任何匹配您的数据库的内容)。

    如果你用谷歌搜索盐、彩虹表、哈希等,那里有大量信息。

    【讨论】:

      【解决方案4】:

      Here is a really good article 在我第一次学习如何存储密码时使用。这是一本非常好的入门书,它是用 C# 编写的

      【讨论】:

        【解决方案5】:

        例如,如果您想将密码存储在数据库中,我建议您使用HMAC(基于哈希的消息验证码);您需要一个加密哈希函数(例如 SHA-512)和一个密钥来生成 MAC。另外,需要注意的是,您不会对密码进行加密,而是对其进行散列

        例如,对于本地保存的密码的加密(尽管Bruce Schneier says you should write your passwords down on paper),您可以使用像RSA 这样的非对称密钥密码系统。在这种情况下,您将拥有一个密钥对,其中包含一个您将与朋友共享的公钥和一个您应该保密的私钥。 RSA 的好处在于您可以使用公钥加密消息,然后使用私钥解密它们;或者您可以使用它来对文档进行数字签名,方法是使用您的私钥计算文档的哈希值,然后使用您的公钥对其进行验证。很漂亮!

        【讨论】:

        • 如果你使用 HMAC,你会使用什么作为密钥?盐?如果是这样,为什么不自己加盐密码并自己散列呢?
        • @Steven 我会使用随机生成的盐作为密钥。在这种情况下,HMAC 可能是一种过度杀伤力 (H(key1, H(key2 || message),但它肯定比加盐哈希 (H(message || salt)) 更强大,例如,HMAC 可以抵御扩展攻击。
        • 有趣。首先,我习惯于看到salt 出现在消息之前,我认为这会干扰扩展攻击。但是我认为salting的主要目的是为了阻止彩虹表,而不是所有可能的攻击,所以HMAC可能确实有点多。再说一次,我认为在这里使用 HMAC 并没有什么太大的危害,特别是如果它经过迭代来加强它。
        【解决方案6】:

        这已经回答过,但简短的版本是你对密码加盐,至少用 SHA-256 对其进行哈希处理,最好使用加强。如果这对您没有意义,那么您还没有准备好写任何东西;继续研究。

        【讨论】:

        • 这将是一个很好的机会来解释否则无法解释的反对意见。
        【解决方案7】:

        我认为您可以使用 MD5,它在 .Net 上实现起来很简单,而且它是一个 128 位(单向)加密哈希函数。但它在大范围内存在哈希冲突问题。

        或者您可以查看 Gost,它是一个 256 位加密哈希函数。

        GOST Hash function

        【讨论】:

          【解决方案8】:

          我已使用此代码以二进制格式加密密码..这可能会对您有所帮助

          private string Encrypt(string clearText)
          {
              string EncryptionKey = "MAKV2SPBNI99212";
              byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
              using (Aes encryptor = Aes.Create())
              {
                  Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
                  encryptor.Key = pdb.GetBytes(32);
                  encryptor.IV = pdb.GetBytes(16);
                  using (MemoryStream ms = new MemoryStream())
                  {
                      using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                      {
                          cs.Write(clearBytes, 0, clearBytes.Length);
                          cs.Close();
                      }
                      clearText = Convert.ToBase64String(ms.ToArray());
                  }
              }
              return clearText;
          }
          

          【讨论】:

          • 不要加密密码,当攻击者得到数据库时,他也会得到加密密钥。使用随机盐在 HMAC 上迭代大约 100 毫秒,然后将盐与哈希一起保存。使用 password_hash、PBKDF2、Bcrypt 等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-03
          • 1970-01-01
          • 2016-10-28
          • 2010-09-21
          • 2013-06-28
          • 2013-01-31
          相关资源
          最近更新 更多