如何在app.config上使用加密连接字符串与Windows窗体上的向导生成的Dataset.xsd

时间:2014-11-04 11:59:15

标签: c# oracle encryption connection-string app-config

我正在使用 Visual Studio 2013(.NET 4.5) Oracle Developer Tools 最新版本开发MDI应用程序。我需要创建一个主窗体,然后它将成为许多不同形式的容器,每个窗体都是不同的应用程序。

应用程序必须连接到不同的Oracle数据库,现在我尝试设置主窗体以保持所有连接字符串的加密,并且可能在单独的文件上。现在连接字符串只有一个。

要加密连接字符串,我已经使用了这些文章中描述的aspnet_regiis方法:

总结一下:

我在app.config中添加了<configProtectedData>部分,我在其中定义了自己的RSA提供程序和密钥容器,因为我需要在多台计算机上导出和导入密钥。然后我创建了密钥容器,并将其与aspnet_regiis工具一起使用来加密<connectionStrings>部分。

我还将<oracle.manageddataaccess.client>变量的TNS_ADMIN部分设置为使用我自己的 Oracle Instant Client 和我的自定义tnsnames.ora文件。这将有助于避免不同的机器操作系统和Oracle客户端版本和配置出现问题。

所以,现在我的最终 app.config 文件应该是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
  </configSections>
  <oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="TNS_ADMIN" value="D:\VSProjects\Visual Studio 2013\Projects\MDITest\MDITest\"/>
      </settings>
    </version>
  </oracle.manageddataaccess.client>
  <configProtectedData>
    <providers>
      <add name="OracleDeveloperRSAProtectedConfigurationProvider"
    type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    keyContainerName="OracleDeveloperDbKeys"
    description="Uses RsaCryptoServiceProvider to encrypt and decrypt" />
    </providers>
  </configProtectedData>
  <connectionStrings configProtectionProvider="OracleDeveloperRSAProtectedConfigurationProvider">
    <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>ZuB8jsXnXR/6Ww47R4Oc/ksSgHsrRuuOkNypbsdfm1ASDlvdsklsgfhtrwaADFHrywswvfhgnjlsGHSDJKFEROvfsd/TV+LKlysPkccEXmJFCcFZ7S9geSInPBaNvYGweR9FcTK1HVcrYMaddgfBK6lpSTTw6cdMRIOcw0Ib//oYPr34=</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>01old8NrGlRAOLdfdtXUKYuBkZPY5XbWMI/j22Hnm8U=</CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>

现在我需要使用数据源配置向导来设置Oracle数据集,然后能够将表从DataSource Explorer拖放到自动创建导航按钮并保持表之间关系等的表单。

Data source configuration Wizard

但是当我在原始app.config的新应用程序上使用向导完成配置时,它要求我创建一个ConnectionString并将其存储在app.config内,然后副本也放在里面Settings.settings文件,显然是纯文本

如果我执行上述过程来加密原始<connectionStrings>中的app.config部分,则DataSet.xsd 仅在 ConnectionString时才有效设置位于 Settings.settings内。它没有使用app.config参数。

我尝试打开DataSet.Designer.cs文件但是为每个Connection对象指定了ConnectionStringTableAdapter个参数,因为那里有很多表格在我的数据集中,我想避免使用查找/替换方法...另外因为如果我需要对数据集进行一些更改,那么DataSet.xsd文件可能会被覆盖,因此所有编辑将失去。

我想知道哪种替换连接字符串的最佳方法是使用加密字符串。

最后,我还想知道我是否可以在保留加密的同时将<connectionStrings>部分移动到另一个.config文件。

- 编辑 -

我已经做了一些更多的测试来重新创建一个新的应用程序项目,而Visual Studio似乎比我想象的更聪明!

在使用向导设置新数据源后,我将第一个连接字符串添加到空白app.config。然后我修改了app.config并将<connectionStrings>部分移到了新的connections.config文件中。我应用aspnet_regiis方法来加密该部分,一切正常。但是,因为我仍然可以在Settings.settings内部以纯文本形式看到连接字符串,所以我决定更改<CipherData>字符串以查看应用程序是否会抛出错误,或者它是否可以正常工作。很简单,如果应用程序抛出错误,那么它使用加密的连接字符串(我想要的 - 正确),否则它使用Settings.settings上的纯文本连接字符串(我不知道&#39} ;想要 - 不正确)。令人惊讶的是,该应用程序抛出异常!

Settings.settings面板似乎总是显示纯文本连接字符串,因为它读取了app.config(以及所谓的connections.config),然后在运行中应用&#34;&#34;解密。 因此,可以将该面板视为app.config的简单视图,该视图显示一些参数,即使它们已加密。

除此之外,我再次使用向导添加了另一个带有另一个连接的数据源。新连接已自动添加到connections.config加密!我注意到了,因为<CipherData>字符串已更改。此外,Settings.settings内的纯文本也可以看到新连接。所以我通过更改字符串重新执行与之前相同的测试,并且应用程序再次抛出错误。

所以,最后,每次添加新连接时都不需要重新加密app.config文件,因为它是自动完成的!太棒了!

0 个答案:

没有答案