【问题标题】:c# configuration for class libraryc# 类库的配置
【发布时间】:2018-11-22 21:45:22
【问题描述】:

我有一个默认没有 app.config 的类库。此库的调用应用程序是“explorer.exe”,我将无法使用 explorer.exe.config 添加我的设置。

有什么方法可以让我的类库读取 app.config?它需要是一个 app.config,因为我打算在部署期间使用 aspnet_regiis 对其进行加密(我将把它重命名为 web.config,对其进行加密并将其重命名为 app.config)。

【问题讨论】:

  • 您是否知道您的应用程序可以在本地解密的任何内容也可以由计算机的用户解密?你只是保护你的秘密不被不知情的用户所知道,所以如果信息真的很敏感,你将需要一种不同的方法。
  • 嗨@Crowcoder,我按照这里的说明进行操作msdn.microsoft.com/en-us/library/zhhddkxy.aspx 不安全吗?
  • 没错。它不安全。任何对 .net 有一点了解的人都可以使用 DPAPI 对其进行解密。 Web 服务器安全的原因是用户没有登录到服务器本身,并且通常 Web 服务器访问仅限于受信任的人员。
  • 您可以控制加密/解密中使用的 entropy 使其变得更加困难(攻击者需要找到代码中使用的熵 - 请参阅https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.protecteddata.protect?view=netframework-4.7.2

标签: c# app-config class-library aspnet-regiis.exe


【解决方案1】:

在 C# 中,真正重要的唯一配置是输出项目的 app.config。对于控制台应用程序,这将是 .exe 配置。这将在bin 中显示为{your app name}.exe.config

您可以使用System.Configuration DLL 中的ConfigurationManager 读取此文件。它的所有用途都将指向执行代码的配置文件,即使在类库中也是如此。因此,导入的类库中所需的任何其他配置都需要添加到此文件中。这是处理配置的规范方式。

如果你真的想要一些其他的配置文件,你可以使用:

ConfigurationManager.OpenMappedExeConfiguration(
            new ExeConfigurationFileMap
            {
                ExeConfigFilename = overrideConfigFileName
            }, 
            ConfigurationUserLevel.None)

overrideConfigFileName 指向您的另一个 app.config 文件。您可以将类库中的文件设置为Content,并确保在构建时将其复制到输出目录中。然后您必须确保它包含在最终部署包中并且所有路径都匹配。

【讨论】:

  • 感谢您的回复。但是,这不是控制台应用程序。这是对 Windows 资源管理器的调整。我没有 exe。
  • 那么你会想走另一条路而不是配置文件——你仍然可以在安装过程中加密和使用 DPAPI 即时解密参见https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection
  • 嗨@Stand__当然,我喜欢这个答案。我会尝试一下。我最初如何将加密的秘密放到机器上? IE 如何“在安装期间加密”?
  • @Sniipe 在安装程序过程中添加一个步骤——这将因您使用的安装程序而异应用程序启动,如果没有,则加密(这样做的好处是您可以在安装后替换文件并重新加密)
  • @Stand__当然这正是我目前的做法。在安装和运行期间有一段时间设置未加密。显然,在安装过程加密之前,您需要确保安装程序包本身不能被轻易读取以获取机密。
【解决方案2】:

最后(根据@Stand__Sure 和@tigerswithguitars,我在我的解决方案中创建了一个新项目,它将是一个控制台应用程序。它将在部署时执行。 感谢 Stand__Sure 链接到https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection

控制台应用程序执行以下操作:

private static void Run()
{
    try
    {
        // Get unencrypted data from Settings.dat
        string[] unencrypted = File.ReadAllLines("C:\\Program Files (x86)\\theAPPSettings\\Settings.dat");

        string unencryptedGuid = unencrypted[0]; //its only 1 setting that I'm interested in

        // Create a file.
        FileStream fStream = new FileStream("C:\\Program Files (x86)\\theAPPSettings\\ProtectedSettings.dat", FileMode.OpenOrCreate);

        byte[] toEncrypt = UnicodeEncoding.ASCII.GetBytes(unencryptedGuid);                

        byte[] entropy = UnicodeEncoding.ASCII.GetBytes("A Shared Phrase between the encryption and decryption");

        // Encrypt a copy of the data to the stream.
        int bytesWritten = Protection.EncryptDataToStream(toEncrypt, entropy, DataProtectionScope.CurrentUser, fStream);

        fStream.Close();

        File.Delete("C:\\Program Files (x86)\\theAPPSettings\\Settings.dat");

        //Console.ReadKey();
    }
    catch (Exception e)
    {
        Console.WriteLine("ERROR: " + e.Message);
    }
}

调用应用程序将其解密如下:

FileStream fStream = new FileStream("C:\\Program Files (x86)\\theAPPSettings\\ProtectedSettings.dat", FileMode.Open);

byte[] entropy = UnicodeEncoding.ASCII.GetBytes("A Shared Phrase between the encryption and decryption");

// Read from the stream and decrypt the data.
byte[] decryptData = Protection.DecryptDataFromStream(entropy, DataProtectionScope.CurrentUser, fStream, Length_of_Stream);

fStream.Close();

string temp = UnicodeEncoding.ASCII.GetString(decryptData);

【讨论】:

    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2012-03-04
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多