加密app.config文件

时间:2010-07-28 02:52:44

标签: c#

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

如果修改/查看此文件并不是一件大事,但我仍然希望确保安全。我已经检查了配置的哈希并确保它是有效的,但我仍然希望增加一层保护。

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

那里有什么我可以加密的东西吗?

7 个答案:

答案 0 :(得分:39)

您无法加密整个<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)。它允许您从任何配置文件加密和解密部分 - 只需在命令行中指定文件名。

答案 1 :(得分:4)

答案 2 :(得分: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文件中,以便您可以即时加密或解密。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

  

如果这个文件是,这不是一个大问题   改性/观看...

在这种情况下,安全性是什么?

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

答案 5 :(得分:0)

您必须在项目中设置对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();

答案 6 :(得分:0)

来自@marc_s的答案真棒,但我在理解如何做他提到的事情时遇到了一些麻烦。对于像我这样没有编程大镜头的人来说,This MSDN forum answer能够以简单的格式解释相同的过程。这是细分:

  

执行此操作的最佳方法是使用aspnet_regiis.exe保护它   应用。即使应用程序不是ASP.NET应用程序,   这仍然有效。这是如何做。

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

    %windir%\ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_regiis -pef   “connectionStrings”

         
        
    1. 你应该看到它说“成功!”
    2.   
    3. 重新打开web.config,它应该如下所示:
    4.   
<?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。
  2.         

    就是这样!你不应该做任何其他事情来做到这一点   工作。如果在代码中使用ConfigurationManager进行检索   设置,它应该使用相同的代码获取它就好了。

         

    话虽如此,如果你要在几台电脑上安装它,   您可能需要考虑为您的用户提供特定于用户的登录信息   使用该应用程序的每个用户的服务器。这样你仍然可以   跟踪他们的行为,你可以阻止他们登录   逐个用户。