【问题标题】:Encrypting app.config File加密 app.config 文件
【发布时间】:2010-07-28 02:52:44
【问题描述】:

我有一个 app.config 文件,需要与我的应用程序一起分发。它是由于对我添加的 ASMX Web 服务的服务引用而创建的。

如果此文件被修改/查看,这没什么大不了的,但我仍然希望确保它的安全。我已经检查了配置的哈希并确保它是有效的,但我仍然想要一个额外的保护层。

这是我的配置:http://pastie.org/private/zjdzadnfwrjvwkmlbdsqw

那么里面有什么可以加密的吗?

【问题讨论】:

标签: c#


【解决方案1】:

您不能加密整个<system.serviceModel> - 它是一个配置节组,其中包含配置节。

aspnet_regiis 只会加密配置部分 - 因此您需要选择性地加密您需要的部分,如下所示:

cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pef "system.serviceModel/bindings" .
aspnet_regiis.exe -pef "system.serviceModel/services" .

等等

有了这个,您可以轻松地加密您需要的内容 - 不太重要的内容可以以明文形式保留。

警告:因为它是aspnet_regiis,它预计会处理web.config 文件 - 将您的app.config 复制到一个位置并命名为web.config,加密您的部分,然后将这些加密的部分复制回来进入你自己的app.config

或者编写您自己的配置部分加密器/解密器 - 这实际上只是几行代码!或者使用我的 - 我写了一个小的 ConfigSectionCrypt 实用程序,从我的 OneDrive 中获取它 - 带有完整源代码(C# - .NET 3.5 - Visual Studio 2008)。它允许您加密和解密任何配置文件中的部分 - 只需在命令行上指定文件名。

【讨论】:

  • 太棒了!只是我正在寻找的答案。您的命令行应用程序完成了这项工作,我将把它藏起来以备将来使用。感谢您的帮助!
  • skydrive 链接似乎已关闭。有没有其他方法可以获取命令行实用程序?
  • @M.R.:抱歉,更新了指向“新”OneDrive 位置的链接
  • OneDrive 文件被 Chrome 报告为恶意文件并被阻止。
  • OneDrive 文件不再可用
【解决方案2】:

您必须在项目中设置对 System.Configuration.dll 的引用才能运行代码。

ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();
                configFileMap.ExeConfigFilename = exeConfigName;
                System.Configuration.Configuration myConfig = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

                ConnectionStringsSection section = myConfig.GetSection("connectionStrings") as ConnectionStringsSection;

                if (section.SectionInformation.IsProtected)
                {
                    // Remove encryption.
                    section.SectionInformation.UnprotectSection();
                }
                else
                {
                    // Encrypt the section.
                    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                }

                myConfig.Save();

【讨论】:

    【解决方案3】:

    我在 web.config 中使用以下加密我的连接字符串,为什么不自己使用相同的。不过我不确定。

    加密:

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "connectionStrings" "\myWebSitePath"
    

    解密:

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pdf "connectionStrings" "\myWebsitePath" 
    

    将它们放入 bat 文件中,以便您可以即时加密或解密。

    【讨论】:

    • 它们不是连接字符串,所以这不起作用。
    • @Eaton,您可以使用它来加密配置文件的任何部分。 connectionStrings 部分只是“秘密”的最常见位置
    • 嗨,Michael,这个 10 年前的问题不再需要建议了,谢谢!
    • @loxxy 但基本上任何人都可以用谷歌搜索它,来到这篇文章并输入这个解密命令并再次阅读它? (与之前有人加密它的方式相同)?
    【解决方案4】:

    @marc_s 的回答很棒,但我在理解如何做他提到的事情时遇到了一些麻烦。 This MSDN forum answer 很好地为像我这样还没有编程大人物的人以简单的格式解释了相同的过程。这是细分:

    最好的方法是使用 aspnet_regiis.exe 保护它 应用。即使应用程序不是 ASP.NET 应用程序, 这仍然有效。就是这样。

    1. 将目录中的 app.config 重命名为 web.config(别担心,这只是临时的,我们稍后会重命名它)。
    2. 转到命令提示符。
    3. 键入以下内容(将最后一个参数替换为包含 app.config 目录的路径,当前重命名为 网络配置。例如,如果 Web 配置的完整路径是 “C:\documents and settings\bob\projects\myproject\web.config”,你 将使用“C:\documents and settings\bob\projects\myproject”)

    %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef “连接字符串”

    1. 您应该看到它显示“成功!”
    2. 重新打开 web.config,它应该看起来像这样:
    <?xml version="1.0" encoding="utf-8" ?>
    
    <configuration>
    
      <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
    
        <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
    
          xmlns="http://www.w3.org/2001/04/xmlenc#">
    
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
    
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    
            <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
    
              <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
    
              <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    
                <KeyName>Rsa Key</KeyName>
    
              </KeyInfo>
    
              <CipherData>
    
                <CipherValue>rUmEA8h02uMZ5M4uEVtL+5M/UvPuyJ4UJz5d/Pd4h4jpFPGVf29ha4d+BMt/iOupVisXDxuZY1jzyc6O0ZixGcCkZqbynwKjouVANQVWUnDgIFgVap2ohsxjblAMtWHTUWDlL0ST5tqSVHNQE+r9G59Bnrp5HkuU3Eg09/8j6Jo=</CipherValue>
    
              </CipherData>
    
            </EncryptedKey>
    
          </KeyInfo>
    
          <CipherData>
    
            <CipherValue>U2JEHzJ+WjSdlocT00cC9TE3+Dn3v7xE1RwX7bKAPuISO2f3hm18MZHnm1hXEBlnDS6iBNRPN87+BJJvZXYz+Sis/ZD4xBZEP4jBG2F8tqlLUbagv3W4epbuTSp2aalb5rdcBoycdIzSj2CApOzSaSKkMDvZrX8yoJI9RfuGnOWmNa4bncHkUEDvWq+uCK/8uaQ48J5uRoq7O0YgIe9jDg==</CipherValue>
    
          </CipherData>
    
        </EncryptedData>
    
      </connectionStrings>
    
    </configuration>
    
    1. 最后,将文件从 web.config 重命名为 app.config。

    就是这样!你不应该做任何其他事情来得到这个 工作。如果您在代码中使用 ConfigurationManager 来检索 设置,它应该可以使用相同的代码为您获取它。

    话虽如此,如果您要在多台计算机上安装它, 您可能需要考虑为您的 每个使用该应用程序的用户的服务器。这样你仍然可以 跟踪他们的行为,您可以完全阻止他们登录 逐个用户。

    【讨论】:

      【解决方案5】:

      该文件将在程序运行时被程序读取,因此更改文件可能不是一个好主意,您可以在每一行中添加校验和,以通过在应用程序中检查它或检查自上次以来的修改来确保它是有效的跑什么的。老实说,我以前从未听说过加密 app.config。

      【讨论】:

      • 我主要想以某种方式隐藏我的许可脚本的 URL。我知道没有任何桌面加密方法会完全限制某人查看它,但我想对标准用户隐藏它。
      • 您可以使用某种 ROT 加密,并且在您的应用程序中您可以解密它,ROT 加密只是字符转换,就像使用像 2 这样的标准移位一样,“abc”的字符串变成“cde”不过,您可以使用更复杂的方法,但这取决于您需要多少安全性。
      【解决方案6】:

      如果这个文件是 修改/查看...

      那么,安全性是为了什么?

      您可以使用SectionInformation.ProtectSection 以编程方式加密配置文件的各个部分。

      【讨论】:

      • 只是为了不让标准用户看到 URL。
      • 我只是不希望它是纯文本。
      • SectionInformation.ProtectSection 似乎是更简单的解决方案,为什么要使用单独的 aspnet_regiis 实用程序?
      • SectionInformation.ProtectSection 推断您在部署之前有一个未加密的源文件,这是不安全的。 Aspnet_regiis.exe 可用于在 dev 和 prod 版本上加密,始终保持两端的加密。不幸的是,aspnet_regiis.exe 适用于 web.config 而不是 app.config。
      猜你喜欢
      • 1970-01-01
      • 2011-06-04
      • 2019-06-19
      • 2010-10-13
      • 2011-08-29
      • 2011-04-19
      • 2011-07-28
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多