我正在开发一个 MDI 应用程序Visual Studio 2013 (.NET 4.5) and Oracle 开发工具最新发布。我需要创建一个主窗体,然后它将成为许多不同窗体的容器,每个窗体都是不同的应用程序。
该应用程序必须连接到不同的 Oracle 数据库,现在我尝试设置主窗体以将所有连接字符串加密并可能保存在单独的文件中。目前连接字符串只有一个。
为了加密连接字符串,我使用了aspnet_regiis
这些文章中描述的方法:
- Framework 4.0 中的 Web Config 加密/解密 http://digantakumar.com/2010/12/20/web-config-encryptiondecryption-in-framework-4-0/
- 使用受保护的配置加密配置信息 http://msdn.microsoft.com/en-us/library/53tyfkaw(v=vs.100).aspx
总结:
我在 app.config 中添加了<configProtectedData>
我定义了自己的 RSA 提供程序和密钥容器,因为我需要在多台计算机上导出和导入密钥。然后我创建了密钥容器并将其与aspnet_regiis
加密工具<connectionStrings>
部分。
我还设置了<oracle.manageddataaccess.client>
部分为TNS_ADMIN
使用我自己的变量Oracle 即时客户端和我的习惯tnsnames.ora
文件。这将有助于避免不同机器操作系统和 Oracle 客户端版本和配置出现问题。
所以,现在这就是我的最终结果应用程序配置文件应该是:
<?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 拖放到自动创建导航按钮并保持表之间关系等的表单中。
但是,当我使用原始应用程序在新应用程序上使用向导完成配置时app.config
,它要求我创建一个 ConnectionString 并将其存储在app.config
然后也将副本放入Settings.settings
file, 显然是纯文本.
如果我执行上述过程来加密<connectionStrings>
原文中的部分app.config
,那么DataSet.xsd
仅当 ConnectionString
设置存在于 Settings.settings
。它不使用app.config
范围。
我尝试打开DataSet.Designer.cs
文件但有Connection
and ConnectionString
为每个指定的参数TableAdapter
对象,并且由于我的数据集中有很多表,我想避免查找/替换方法...另外,因为如果我需要对数据集进行一些更改,那么DataSet.xsd
文件可能会被覆盖,因此所有编辑都将丢失。
我想知道哪种是替换连接字符串并使用加密字符串的最佳方法。
最后我也想知道我是否可以移动我的<connectionStrings>
部分到不同的 .config 文件,同时保持加密。
- 编辑 -
我做了一些更多的测试来重新创建一个新的应用程序项目,Visual Studio 似乎比我想象的更聪明!
我将第一个连接字符串添加到空白处app.config
使用向导设置新数据源后。然后我编辑了app.config
并移动了<connectionStrings>
节到一个新的connections.config
文件。我应用了aspnet_regiis
加密该部分的方法并且一切正常。但是,因为我仍然可以在里面看到纯文本的连接字符串Settings.settings
我决定改变<CipherData>
字符串来查看应用程序是否会抛出错误或者是否可以正常工作。非常简单,如果应用程序抛出错误,则它使用加密的连接字符串(我想要的 - 正确),否则它使用纯文本连接字符串Settings.settings
(我不想要的 - 不正确)。令人惊讶的是,应用程序抛出了异常!
看来Settings.settings
面板始终显示纯文本连接字符串,只是因为它读取 app.config(以及connections.config),然后应用“即时”解密。因此,该面板可以被视为 app.config 的简单视图,显示一些参数,即使它们是加密的。
除此之外,我再次使用向导添加了具有另一个连接的第二个数据源。新连接会自动添加到connections.config
已加密!我注意到它是因为<CipherData>
字符串被更改。新连接也以纯文本形式显示在Settings.settings
。因此,我通过更改字符串重新进行了与之前相同的测试,应用程序再次抛出错误。
所以,最后,每次添加新连接时无需重新加密 app.config 文件,因为它是自动完成的! Great!