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

您可以使用它来存储任何类型的值,而不仅仅是字符串。但这不应该用于敏感数据,因为用户可以使用注册表编辑器读取和写入注册表的值。