使用C#设置功能保存密码时的最佳做法是什么?

时间:2010-10-14 20:07:37

标签: c# database security encryption

我正在使用内置功能设置的Visual C#来保存我的一些程序选项。 我还想存储一个密码,但随后公开...是否可以在使用此设置方法保存密码之前加密密码然后将其解密?

3 个答案:

答案 0 :(得分:4)

一种简单的方法是用自己加密密码。您永远无法解密,但您可以将用户输入的密码与之进行比较。

答案 1 :(得分:4)

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

这是我编写的用来包装它的类:

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);
      }
   }
}

答案 2 :(得分:2)

如果你加密密码,你仍然需要在程序的某个地方存储一个解密密钥,所以它仍然是隐蔽的安全性。

然而,它让诚实的人保持诚实。

我见过的最常见的做法是挑战/响应系统,用户输入注册名称,程序提供挑战字符串,然后通过电子邮件向用户发送相应的响应字符串(加密),用户剪切并粘贴到程序中的注册对话框中。该程序解密响应,将其与挑战进行比较,然后离开。

当然,由于你仍然需要在程序本身提供解密密码,它仍然可以被坚定的黑客击败。