我正在使用内置功能设置的Visual C#来保存我的一些程序选项。 我还想存储一个密码,但随后公开...是否可以在使用此设置方法保存密码之前加密密码然后将其解密?
答案 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)
如果你加密密码,你仍然需要在程序的某个地方存储一个解密密钥,所以它仍然是隐蔽的安全性。
然而,它会让诚实的人保持诚实。
我见过的最常见的做法是挑战/响应系统,用户输入注册名称,程序提供挑战字符串,然后通过电子邮件向用户发送相应的响应字符串(加密),用户剪切并粘贴到程序中的注册对话框中。该程序解密响应,将其与挑战进行比较,然后离开。
当然,由于你仍然需要在程序本身提供解密密码,它仍然可以被坚定的黑客击败。