3

我是 Windows 窗体的新手。

我正在.Net Framework 2.0 中设计一个 Windows 应用程序,其中,我需要在系统中的某处存储用户名和密码,并在每次打开我的应用程序时访问它们,有时我需要在用户命令上更改这些凭据。

我听说注册表是这样做的最佳方式。我对在 C# .Net 中使用注册表一无所知。

所以你能帮我吗

如何获取注册表中的值,以及如何将值设置到注册表。??

我正在使用 .Net Framework 2.0

4

7 回答 7

7

主题非常广泛。您应该开始在 MSDN 上阅读有关该课程的信息

Microsoft.Win32.RegistryKey

但我真的建议完全避免使用注册表。
允许注册表存储普通应用程序的配置信息从一开始就是微软的错误。

您可以编写一个简单的散列函数,将其应用于您的用户名和密码,并将结果存储在 ApplicationData 文件夹中的文件中。在下一次运行时检查文件是否存在,读取它并将其内容与用户名和密码的哈希值进行比较。

这里是一个粗略的例子,只是为了让你从你自己的代码开始。

private void button1_Click(object sender, EventArgs e)
{
    string user = "Steve";
    string pass = "MyPass";

    string hashedUser = GetHashedText(user);
    string hashedPass = GetHashedText(pass);

    string file = Path.Combine(Environment.GetFolderPath 
                       (Environment.SpecialFolder.ApplicationData), 
                       "MyKeys.txt");

    if (File.Exists(file))
    {
        using (StreamReader sr = new StreamReader(file))
        {
            string recordedUser = sr.ReadLine();
            string recordedPass = sr.ReadLine();
            if (recordedUser == user && recordedPass == pass)
                MessageBox.Show("User validated");
            else
                MessageBox.Show("Invalid user");
        }
    }
    else
    {
        using (StreamWriter sw = new StreamWriter(file, false))
        {
            sw.WriteLine(hashedUser);
            sw.WriteLine(hashedPass);
        }

    }
}

private string GetHashedText(string inputData)
{ 
    byte[] tmpSource;
    byte[] tmpData;
    tmpSource = ASCIIEncoding.ASCII.GetBytes(inputData);
    tmpData = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    return Convert.ToBase64String(tmpData);
}

编辑:根据您的评论,您似乎需要一个加密和解密功能。下面的代码取自扩展溢出,您可以在其中找到其他有用的方法。现在,在写入磁盘之前,使用要加密的字符串和密钥调用 Encrypt 方法。阅读后,调用 Decrypt 方法传递加密文本和密钥。

string cryptedUser = Encrypt(user, "your_secret_key_ABCDEFG");
....

public string Encrypt(string stringToEncrypt, string key)
{
    if (string.IsNullOrEmpty(stringToEncrypt))
        throw new ArgumentException("An empty string value cannot be encrypted.");
    if (string.IsNullOrEmpty(key))
        throw new ArgumentException("Cannot encrypt using an empty key.");

    CspParameters cspp = new CspParameters();
    cspp.KeyContainerName = key;
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
    rsa.PersistKeyInCsp = true;
    byte[] bytes = rsa.Encrypt(UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);
    return BitConverter.ToString(bytes);
}

string clearText = Decrypt(cryptedText, "your_secret_key_ABCDEFG");
....

public string Decrypt(string stringToDecrypt, string key)
{
    string result = null;
    if (string.IsNullOrEmpty(stringToDecrypt))
        throw new ArgumentException("An empty string value cannot be encrypted.");
    if (string.IsNullOrEmpty(key))
        throw new ArgumentException("Cannot decrypt using an empty key");
    try
    {
        CspParameters cspp = new CspParameters();
        cspp.KeyContainerName = key;
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
        rsa.PersistKeyInCsp = true;
        string[] decryptArray = stringToDecrypt.Split(new string[] { "-" }, 
                                 StringSplitOptions.None);
        byte[] decryptByteArray = Array.ConvertAll<string, byte>
                                 (decryptArray, (s => Convert.ToByte(byte.Parse(s,
                                 System.Globalization.NumberStyles.HexNumber))));
        byte[] bytes = rsa.Decrypt(decryptByteArray, true);
        result = System.Text.UTF8Encoding.UTF8.GetString(bytes);
    }
    finally
    {
        // no need for further processing
    }
    return result;
}

当然,我假设您的应用程序所需的安全级别允许将用户名和密码存储在本地系统中。(如您所知,存储在本地系统上的所有内容都不是很安全)

于 2012-11-19T08:51:00.620 回答
2

使用注册表的读、写和删除功能检查本教程

使用 C# 从注册表中读取、写入和删除

于 2012-11-19T08:45:53.570 回答
2

这是一个很好的教程,将解释读/写注册表。

http://www.switchonthecode.com/tutorials/csharp-snippet-tutorial-editing-the-windows-registry

您还需要了解有关注册表的更多信息。

  1. 注册表由五个部分组成,其中 HKEY_CURRENT_USER 存储当前登录用户的设置。建议您将设置存储在此键下。设置一般存储在 HKEY_CURRENT_USER/Software//

  2. 您可以在 HKEY_LOCAL_MACHINE 键下存储机器范围的设置(适用于所有使用计算机的用户)。但是,对此的读/写操作需要管理权限。您的应用程序必须以管理员权限运行才能写入此密钥。

  3. 如果在注册表中找不到,请确保您的注册表读取机制返回默认值,并将默认值写入注册表。这样,您将永远不会用完设置值。

  4. 注册表可以编辑和读取。如果您打算将用户名/密码组合存储在注册表中,请确保在存储之前对其进行加密。此外,为了确保它也不会在任何其他计算机上使用,您应该使用一些特定于机器的信息对其进行加密。

希望这对您有所帮助。

于 2012-11-19T08:52:38.560 回答
2

您可以尝试使用独立存储。MSDN Blurb代码示例和(假设您正在存储用户凭据)加密示例。我已经尽可能链接了 .net 2.0 示例。

在注册表中存储应用程序数据已变得不受欢迎,因为有更简单的替代方法,并且使用注册表会损害用户计算机的性能。

于 2012-11-19T08:58:29.300 回答
1

我从来没有使用过注册表,但谷歌上出现的第一件事就是这个。看起来很容易理解,所以玩得开心:)

于 2012-11-19T08:45:18.600 回答
1

这样做注册表的方式是错误的方式,我相信做一个配置文件并阅读这个配置是更好的方式。但无论如何在这里你如何做注册表的事情

http://www.codeproject.com/Articles/3389/Read-write-and-delete-from-registry-with-C

于 2012-11-19T08:50:21.000 回答
1

你需要问自己几个问题:

  1. 应该只有一个用户能够使用 uid/密码吗?

  2. 密码的存储安全性如何?

在注册表中存储信息非常容易。 http://msdn.microsoft.com/en-us/library/microsoft.win32.registry.aspx

如果您只想为一个用户存储它,请将其存储在 HKEY_CURRENT_USER/software/your_company/your_product 下,否则将其存储在 HKEY_LOCAL_MACHINE/software/your_company/your_product 下。

如果要安全地存储您的密码,有比注册表更安全的解决方案。

于 2012-11-19T08:59:09.743 回答