配置文件 - 加密连接字符串

Posted

技术标签:

【中文标题】配置文件 - 加密连接字符串【英文标题】:Configuration file - encrypting connection string 【发布时间】:2020-06-25 10:51:15 【问题描述】:

我正在尝试开发一个连接到 SQL 数据库的 C# Winform 应用程序。

到目前为止,我能够将最敏感的数据从我的 XML 配置文件移动到外部 XML 配置文件,但仅此而已。

我要做的最后一件事是加密该文件,因为很多人都可以访问应用程序所在的目录。

我的主 [APP] 配置文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings configSource="conn_string.config"/>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

还有我试图隐藏连接字符串的 [conn_string] 外部配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<connectionStrings>
<add name="myConnectionStringName"
providerName="System.Data.SqlClient"
connectionString="Data Source=ServerName;Initial 
Catalog=InitialDatabaseName;User=UserName;Password=MyPassword;Application Name=MyAppName" />
</connectionStrings>

现在谈到加密,我读到 asp-netregiis.exe 只寻找名为“web”的文件 所以我暂时将我的“conn_string”文件重命名为“web”

并尝试了加密(通过开发者命令行VS):

aspnet_regiis -pef "connectionStrings" "path_to_my_conn_string_file"

结果是:~我的翻译

The web.config file doesn't contain a configuration tag 

所以我添加了一个这样的:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="myConnectionStringName"
providerName="System.Data.SqlClient"
connectionString="Data Source=ServerName;Initial 
Catalog=InitialDatabaseName;User=UserName;Password=MyPassword;Application Name=MyAppName" />
</connectionStrings>
</configuration>

现在它抱怨:~又是我的翻译

File format configSource must be an element conatining section name

【问题讨论】:

首先,您必须在您提到的 "path_to_my_conn_string_file" 部分中提供包含目录。那么您的配置名称必须是 web.config(不区分大小写)。你会这样尝试吗? 这能回答你的问题吗? Encrypting the connection string in web.config file in C# 【参考方案1】:

您正在采取的使用 aspnet_Regiis 的步骤实际上适用于托管在 Internet Information Server (IIS) 中的 Web 应用程序。它正在寻找的文件实际上是“web.config”。您提到正在构建的应用程序是一个 winforms 应用程序,它不是一个 Web 应用程序。常规的 winforms 应用程序通常通过名为“app.config”的文件进行配置。 Visual Studio 可能已经为你创建了一个基础 app.config,具体取决于你使用的版本。

您可以“欺骗”aspnet_Regiis 加密您的配置文件,方法是暂时将 app.config 重命名为 web.config,然后使用指向我们“假”的确切路径的标志调用 aspnet_regiis网络配置:

为简单起见,假设您的初始 app.config 位于 c:\MyPrograms\MyApp 中。

    将 app.config 重命名为 web.config。 在管理命令提示符下,将当前目录设置为 c:\windows\micrsoft.net\framework\v4.0.30319

    调用 aspnet_regiis,使用“-pef”开关指示该工具加密 web.config 的特定部分:

    aspnet_regiis -pef "connectionStrings" c:\MyPrograms\MyApp

    如果您看到“成功”消息,请将您的 web.config 重命名为 app.config,然后运行您的应用程序。 .NET 应该在运行时自动解密您的连接字符串在那台机器上

如果您需要将此应用程序放在其他机器上,您可能需要考虑设置一个可以安装在其他机器上的通用加密密钥,并在 web.config 中定义一个利用该密钥的提供程序。但是现在,让我们让基本流程在本地工作,然后在我们知道这部分工作正常后,再考虑其他组件。

希望这会有所帮助!

【讨论】:

好吧,我照你说的做了,它奏效了。但现在我将所有内容都保存在一个配置文件中。 我不知道有任何机制可以让您将凭据存储在单独的配置文件中。至少据我所知,.NET 配置结构被设计为在 app.config 或 web.config 的范围内工作(视情况而定)。如果您必须单独保留加密凭据,则可能需要在您的应用中采用自定义解决方案。 将所有内容保存在一个配置文件中的主要问题是,当我将代码推送到远程存储库时,我必须排除(git 忽略)整个配置文件。我不知道这可能完全没问题,但是当我看到时,有机会分割这个配置文件,所以我可以将我的连接字符串保存在其他地方,然后我认为这可能看起来更专业。你怎么看? 我一直将加密的配置数据保存在 app.config 或 web.config 中,这就是我对您的建议。在我们的环境中,我们很久以前构建了一个单独的加密密钥,安装在我们的本地 (Dev) 机器和我们的网络服务器上,允许一个加密提供程序即时加密/解密所有内容。 我想我会坚持你的建议。谢谢!

以上是关于配置文件 - 加密连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

为啥把连接数据库用的连接字符串放到配置文件中

加密web.config中的连接字符串

NodeJS 加密到 Postgres 的连接字符串

在非 ASP.Net 应用程序中加密连接字符串

winform程序如何加密配置文件

为 WinForms 应用程序加密 app.config 中的连接字符串