C# 加密app.config文件

C# 加密app.config文件,c#,C#,我有一个app.config文件需要与我的应用程序一起分发。创建它是因为我添加了一个ASMXWeb服务的服务引用 如果这个文件被修改/查看,这不是什么大不了的事,但我仍然希望它安全。我已经检查了配置的散列,并确保它是有效的,但我仍然希望增加一层保护 这是我的配置: 那里面有我可以加密的东西吗?程序运行时会读取文件,因此更改文件可能不是个好主意,您可以在应用程序中检查每一行的校验和,或者检查上次运行后的修改或其他内容,以确保每一行的校验和有效。老实说,我以前从未听说过对app.config进行加密

我有一个app.config文件需要与我的应用程序一起分发。创建它是因为我添加了一个ASMXWeb服务的服务引用

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

这是我的配置:


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

程序运行时会读取文件,因此更改文件可能不是个好主意,您可以在应用程序中检查每一行的校验和,或者检查上次运行后的修改或其他内容,以确保每一行的校验和有效。老实说,我以前从未听说过对app.config进行加密。

你可以对app.config或Web.config的部分进行加密,有一堆博客条目详细介绍了这一点:

以下是MSDN版本:

下面是一个关于如何通过代码进行加密的示例:

我在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文件中,以便您可以动态加密或解密

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

在这种情况下,安全是为了什么


您可以使用编程方式加密配置文件的节。

您无法加密整个
-它是一个配置节组,其中包含配置节

aspnet\u regis
将只加密配置部分-因此您需要有选择地加密您需要的部分,如下所示:

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

有了它,你可以很容易地加密你需要的东西——不太重要的东西可以用明文保存

警告:由于它是
aspnet\u regiis
,它需要处理
web.config
文件-将您的
app.config
复制到某个位置并调用它
web.config
,加密您的部分,然后将这些加密部分复制回您自己的
app.config


或者编写您自己的配置节加密/解密程序-它实际上只是几行代码!或者使用我的-我写了一个小的
ConfigSectionCrypt
实用程序,来我的-完整的源代码(C#-.NET3.5-VisualStudio2008)。它允许您加密和解密任何配置文件中的节-只需在命令行上指定文件名。

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

来自@marc_s的答案非常棒,但我在理解他所说的到底该怎么做上有点困难。对于像我这样还没有为大人物编程的人来说,用simpleton格式解释同样的过程做得非常好。以下是分项数字:

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

  • 将目录中的app.config重命名为web.config(别担心,这只是暂时的,我们稍后会重新命名)
  • 转到命令提示符
  • 键入以下内容(将最后一个参数替换为包含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\u regiis-pef “连接字符串”

  • 你应该看到它说“成功了!”
  • 重新打开web.config,它应该如下所示:
  • 
    Rsa密钥
    rUmEA8h02uMZ5M4uEVtL+5M/UvPuyJ4UJz5d/Pd4h4jpFPGVf29ha4d+BMt/IOUPVISxDxUZY1JZYC60ZIxGCCKZQBYNWKJOUVANQVWUNDGIGVGVAP2OHSJBLAMTWHTUDL0ST5TQSVHNQE+r9G59Bnrp5HkuU3Eg09/8j6Jo=
    U2JEHzJ+WjSdlocT00cC9TE3+DN3V7XE1RWX7BKAPUISO2F3HM18MHNM1HXEBLNDS6IBNRPN87+BJVZXYZ+Sis/ZD4XBZEP4JBG2F8TQLLUBAGV3W4W4EPUTSP2ALB5RDCBOYCDIZJ2CAPOZKMDVZRX8YOJI9RFUGNOWMNA4BNCHKUEDVWQ+uCK/8UAQ48J5UROQ0YGIE9JDG==
    
  • 最后,将文件从web.config重命名为app.config 就这样!你不应该做任何其他的事情来让这个 工作如果在代码中使用ConfigurationManager来检索 设置后,它应该可以使用相同的代码获取它

    也就是说,如果你要在几台计算机上安装这个, 您可能需要考虑向用户提供特定于用户的登录。 每个使用应用程序的用户的服务器。这样你仍然可以 跟踪他们的行为,你就可以阻止他们在任何时候登录 以用户为单位


    我主要想以某种方式隐藏我的授权脚本的URL。我知道没有任何桌面加密方法会完全限制某人查看它,但我想对标准用户隐藏它。你可以使用某种ROT加密,在你的应用程序中你可以解密它,ROT加密只是字符移位,就像使用标准移位一样2。一个字符串“abc”变成“cde”虽然你可以使用更复杂的方法,但你需要多大的安全性取决于你自己。只是为了让标准用户看不到URL。我只是不希望它是纯文本。SectionInformation.ProtectSection似乎是更简单的解决方案,为什么要使用单独的aspnet_regiis实用程序?SectionInformation.ProtectSection推断您在部署之前有一个未加密的源文件,这是不安全的。Aspnet_regiis.exe可用于加密开发和产品版本,请维护
    <?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>