C# 将数据与数据库分开存储
C# Store data apart from Database
我想存储几个要在我的应用程序中使用的字符串。
但我不想将它存储在我的数据库或配置中。
原因是如果有人将应用程序从一个系统复制到另一个系统,则不应复制字符串。
此外,字符串可以在运行时通过应用程序进行操作。
执行此操作的最佳方法是什么?
一种方法是使用该机器本地的 key
加密您的 string
,例如MAC address
,同时保存在机器上。显然要使用它,您必须阅读它,然后使用相同的密钥对其进行解密。
这样即使将字符串复制到另一个系统,新系统也无法解密和使用 string
,因为它没有与 key
相同的 key
原机.
此解决方案与您决定将字符串存储在 bin 或应用程序数据中还是系统的其他位置无关。
简单的解决方案,在用户文档中创建一个文件并将字符串存储在那里。它简单易行,但不提供任何类型的安全性。如果您要存储敏感信息,那么任何人都可以读取它。用户也可以删除文件,这将导致文件未找到异常。
第二个选项是将其写入注册表。这既不难也不简单。注册表将解决文件的安全问题。用户不会意外删除注册表。
存储用户数据的一种简单方法是在用户主目录中创建一个文件。如果数据仅供程序内部使用,则可以使用 AppData\Local
文件夹(例如 "C:\Users\myuser\AppData\Local"
:
File.WriteAllText(
Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"MyCompany", "MyProduct", "MyStrings.txt"),
"Some strings");
这里的字符串存放在"C:\Users\myuser\AppData\Local\MyCompany\MyProduct\MyStrings.txt"
.
但是,用户不会轻易看到这些文件。所以你应该考虑在不再需要这些文件时清理它们。
您可以使用注册表来做类似的事情。
我有一个 Registry-Helper-Class 来执行这样的操作:
public class RegistryUtils
{
public static string Read(string subKey, string keyName)
{
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(subKey, true);
if (registryKey == null)
{
registryKey = Registry.CurrentUser.CreateSubKey(subKey, true);
}
var keyValue = registryKey.GetValue(keyName);
registryKey.Close();
return keyValue.ToString();
}
public static void Write(string subKey, string keyName, string keyValue)
{
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(subKey, true);
if (registryKey == null)
{
registryKey = Registry.CurrentUser.CreateSubKey(subKey, true);
}
registryKey.SetValue(keyName, keyValue);
registryKey.Close();
}
}
然后你可以使用 class 来存储这样的东西:
var storedValue = RegistryUtils.Read("MY_COMPANY/MY_PRODUCT","MY_STORED_VALUE");
RegistryUtils.Write("MY_COMPANY/MY_PRODUCT", "MY_STORED_VALUE", storedValue);
您可以使用它来存储任何类型的值,而不仅仅是字符串。但这不应该用于敏感数据,因为用户可以使用注册表编辑器读取和写入注册表的值。
我想存储几个要在我的应用程序中使用的字符串。 但我不想将它存储在我的数据库或配置中。 原因是如果有人将应用程序从一个系统复制到另一个系统,则不应复制字符串。 此外,字符串可以在运行时通过应用程序进行操作。 执行此操作的最佳方法是什么?
一种方法是使用该机器本地的 key
加密您的 string
,例如MAC address
,同时保存在机器上。显然要使用它,您必须阅读它,然后使用相同的密钥对其进行解密。
这样即使将字符串复制到另一个系统,新系统也无法解密和使用 string
,因为它没有与 key
相同的 key
原机.
此解决方案与您决定将字符串存储在 bin 或应用程序数据中还是系统的其他位置无关。
简单的解决方案,在用户文档中创建一个文件并将字符串存储在那里。它简单易行,但不提供任何类型的安全性。如果您要存储敏感信息,那么任何人都可以读取它。用户也可以删除文件,这将导致文件未找到异常。
第二个选项是将其写入注册表。这既不难也不简单。注册表将解决文件的安全问题。用户不会意外删除注册表。
存储用户数据的一种简单方法是在用户主目录中创建一个文件。如果数据仅供程序内部使用,则可以使用 AppData\Local
文件夹(例如 "C:\Users\myuser\AppData\Local"
:
File.WriteAllText(
Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"MyCompany", "MyProduct", "MyStrings.txt"),
"Some strings");
这里的字符串存放在"C:\Users\myuser\AppData\Local\MyCompany\MyProduct\MyStrings.txt"
.
但是,用户不会轻易看到这些文件。所以你应该考虑在不再需要这些文件时清理它们。
您可以使用注册表来做类似的事情。
我有一个 Registry-Helper-Class 来执行这样的操作:
public class RegistryUtils
{
public static string Read(string subKey, string keyName)
{
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(subKey, true);
if (registryKey == null)
{
registryKey = Registry.CurrentUser.CreateSubKey(subKey, true);
}
var keyValue = registryKey.GetValue(keyName);
registryKey.Close();
return keyValue.ToString();
}
public static void Write(string subKey, string keyName, string keyValue)
{
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(subKey, true);
if (registryKey == null)
{
registryKey = Registry.CurrentUser.CreateSubKey(subKey, true);
}
registryKey.SetValue(keyName, keyValue);
registryKey.Close();
}
}
然后你可以使用 class 来存储这样的东西:
var storedValue = RegistryUtils.Read("MY_COMPANY/MY_PRODUCT","MY_STORED_VALUE");
RegistryUtils.Write("MY_COMPANY/MY_PRODUCT", "MY_STORED_VALUE", storedValue);
您可以使用它来存储任何类型的值,而不仅仅是字符串。但这不应该用于敏感数据,因为用户可以使用注册表编辑器读取和写入注册表的值。