在C#2.0中使用Registry(Windows窗体)

我是Windows Forms的新手。

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

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

你能帮帮我吗

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

我正在使用.Net Framework 2.0

这个主题非常广泛。 您应该开始在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); } 

编辑:根据您的评论,似乎您需要一个加密和解密function。 下面的代码是从Extension Overflow中获取和改编的,您可以在其中找到其他有用的方法。 现在,在写入磁盘之前,使用要加密的字符串和密钥调用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 (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; } 

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

使用读取,写入和删除function检查本教程

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

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

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. 注册表可以编辑并可以阅读。 如果您计划在注册表中存储用户名/密码组合,请确保在存储之前对其进行加密。 此外,为确保不在任何其他计算机上使用它,您应该使用某些机器特定信息对其进行加密。

希望这对你有所帮助。

您可以尝试使用IsolatedStorage。 MSDN Blurb , 代码示例 ,以及(假设您存储用户凭据) 加密示例 。 我尽可能链接.net 2.0示例。

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

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

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

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

你需要问自己几个问题:

  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下。

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