使用C#设置功能保存密码的最佳实践是什么?

5

我正在使用Visual C#内置功能设置来保存我的程序选项。我还想存储一个密码,但这使得它变成公共的...是否可以在使用此设置方法保存之前对密码进行加密,然后再解密回来?


https://crackstation.net/hashing-security.htm - Soren
3个回答

4

对于简单的加密需求,我使用DPAPI通过ProtectedData类。为了使结果加密值可以存储在文本文件或注册表中,我对结果字节数组进行编码。

这是我编写的包装类:

namespace SomeNamespace
{
   using System;
   using System.Security.Cryptography;
   using System.Text;

   /// <summary>
   /// used for encryption and decryption
   /// </summary>
   public static class DataProtector
   {
      private const string EntropyValue = "secret";

      /// <summary>
      /// Encrypts a string using the DPAPI.
      /// </summary>
      /// <param name="stringToEncrypt">The string to encrypt.</param>
      /// <returns>The encrypted data.</returns>
      public static string EncryptData(string stringToEncrypt)
      {
         byte[] encryptedData = ProtectedData.Protect(Encoding.Unicode.GetBytes(stringToEncrypt), Encoding.Unicode.GetBytes(EntropyValue), DataProtectionScope.LocalMachine);
         return Convert.ToBase64String(encryptedData);
      }

      /// <summary>
      /// Decrypts a string using the DPAPI.
      /// </summary>
      /// <param name="stringToDecrypt">The string to decrypt.</param>
      /// <returns>The decrypted data.</returns>
     public static string DecryptData(string stringToDecrypt)
      {
         byte[] decryptedData = ProtectedData.Unprotect(Convert.FromBase64String(stringToDecrypt), Encoding.Unicode.GetBytes(EntropyValue), DataProtectionScope.LocalMachine);
         return Encoding.Unicode.GetString(decryptedData);
      }
   }
}

4
一个简单的方法是使用密码本身对其进行加密。您将永远无法解密它,但您将能够将用户输入的密码与其进行比较。

你能给我一个提示,如何用“密码本身加密密码”吗?你是什么意思?谢谢。 - Badr Hari
1
我怀疑 OP 想要存储密码,以便用户不需要再次输入... 如果是这种情况,这个解决方案并不是很有帮助 ;) - Thomas Levesque
@Badr:作为最佳实践,最好不要存储密码,这样更安全。如果您向忘记密码的人发放临时密码,则无需担心检索密码。无论如何,Andrew 的意思是使用密码本身作为加密密钥 - Robert Harvey
是的,Robert完全正确。很抱歉我现在没有任何示例代码。任何.NET加密代码样本都需要一个密钥和要加密的值。将密码用作密钥和值,并将结果存储在您的数据库中。下次用户输入密码时,以相同方式加密并将其与存储在数据库中的内容进行比较。这样,您永远不会以明文形式存储它,并且无法轻松解密它。 - Andrew Lewis

2
如果你加密密码,仍然需要在程序中存储解密密钥,因此它仍然是一种安全性通过混淆来实现的方法。
然而,这样做可以让诚实的人保持诚实。
我见过最常见的做法是挑战/响应系统,用户输入注册名,程序提供一个挑战字符串,您将相应的响应字符串(加密)通过电子邮件发送给他们,然后用户将其剪切并粘贴到程序的注册对话框中。程序解密响应,将其与挑战进行比较,然后就可以使用了。
当然,由于你仍然需要在程序本身中提供解密密码,所以它仍然可能被决心破解的黑客攻击。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接