在 Visual Studio 2017 年加密连接字符串

Encrypting connections strings in Visual Studio 2017

您好,我希望这不会太模糊,无法获得帮助!

我们已经搜索了好几天,但找不到有效的答案。我们为不同的项目使用 Advanced Installer,并且需要一种明智的方法来加密不使用 windows 身份验证的站点的连接字符串到 sql 服务器。

我们已尝试在安装后进行加密,运行 高级安装程序中的自定义 DLL 以及各种。由于 Microsoft 在 Program Files 文件夹周围令人沮丧的权限堡垒,因此没有任何效果。

有谁知道不涉及 Windows 数据库身份验证的合适方法吗?

任何帮助将不胜感激。正如您可以想象的那样,此请求是作为寻找良好解决方案的最后尝试而提出的。

我很震惊没有一个相当标准的 - 但如果你不在 SQL 服务器上使用 Windows 身份验证,我目前还没有看到一个据我所知。

提前感谢您提供的任何帮助!

最诚挚的问候 理查德

编辑: 据我了解,encrypt/decrypt 只能在同一台机器上完成 - 阻止我发送加密的 app.config。密钥基于因机器而异的 machine.config。

我终于找到了使用 Advanced Installer 解决此问题的关键 - 它不能 运行 内置在托管代码中的 DLL,因此您需要使用另一个名为 Wix 的工具集来创建 Advanced Installer 可以使用的 DLL可以使用。相关说明可在此处找到:https://www.advancedinstaller.com/user-guide/qa-c-sharp-ca.html

对于我们之后的加密,这是我在 Wix 项目中作为自定义操作创建的函数(为清楚起见,减去我们实际代码具有的 try-catch、文件检查和日志记录):

<CustomAction()>
Public Shared Function Encrypt(session As Session) As ActionResult
    Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(session.CustomActionData("ExecutablePath"))
    Dim section As ConnectionStringsSection = TryCast(config.GetSection("connectionStrings"), ConnectionStringsSection)
    If section.SectionInformation.IsProtected Then Return ActionResult.SkipRemainingActions
    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider")
    If Not section.SectionInformation.IsProtected Then Return ActionResult.Failure
    config.Save()
    Return ActionResult.Success
End Function

当您构建项目时,它会生成两个 DLL 文件:一个普通的 .dll 和一个 .CA.dll。在 Advanced Installer 项目中,将 .CA.dll 添加到包含的文件中(最好作为临时文件,因为它只在安装期间需要)。然后转到自定义操作,添加一个新的 "Call Function From Attached Native DLL" 操作,将其指向您选择添加到项目中的同一个 .CA.dll 文件,然后像这样设置其余的操作: (attached image)

...其中 [#ConfigEncryptionTestProgram.exe] 应替换为您的可执行文件!

这里的重要位是操作在序列中的位置(就在完成执行之前)、执行时间(提交)以及使其 运行 具有特权的执行选项,以便它可以绕过 Microsoft 对修改 Program Files 文件夹中文件的限制。

我做到了,而且没有写过一行真正的代码。

我刚刚在安装程序中添加了自定义加密操作:

  • 启动文件(带序列)
  • 要启动的文件:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe
  • 命令行:-pe connectionStrings -app /myappname
  • 隐藏程序的window
  • 你会设置"Run as administrator"(不适用于我们,因为我们的安装程序完全以管理员身份运行)
  • 执行时间:立即
  • 等待自定义操作完成后再继续
  • 如果自定义操作 returns 出现错误,请勿使安装失败

另一个用于解密,设置相同,但使用命令行 -pd 而不是 -pe

然后我把解密移到"Dialogs->Searches"阶段之前,把加密移到"Execution->InstallFinalize"阶段之后: