在我的 winforms 应用程序中,我正在对本地级别的连接字符串进行散列。
但这里有几个问题。
我的应用程序解密连接字符串后,连接字符串信息是否以明文形式发送?而且由于我的应用程序是本地安装的,所以中间的人可能是任何用户?
我如何保护连接字符串,因为“强制加密”选项需要额外的证书?
最佳答案
您在此处只有有限数量的方法来确保您的连接字符串安全可靠。
一种选择是,如果您的连接字符串存储在 web.config 或 app.config 文件中(分别用于 Web 和 Windows 应用程序),您可以加密该值。这里有几个链接,详细说明了如何做到这一点:
Encrypting Web.Config Values in ASP.NET 2.0
Encrypt Connection Strings in VS 2005 .config Files
当然,正如您所说的那样,这可能无法实现您想要的安全性,因为应用程序很可能在用户的机器上运行,因此 app.config 文件(即使处于加密状态)和相关的加密/解密 key 也将在用户的机器上可用。然后,知识渊博且有进取心的用户可以访问您的“纯文本”连接字符串。
恕我直言,防止您的用户看到您的数据库连接字符串的最佳方法之一就是从一开始就永远不要将其提供给他们,无论是否加密。这将要求您的 Windows 窗体应用程序不直接与数据库对话(使用连接字符串),而是直接与(例如)Web 服务对话。
当然,您可以为 Windows 窗体应用程序提供一个可以访问 Web 服务的 URL,但是此 Web 服务的使用将通过仅允许使用用户特定的用户名/密码组合进行访问来受到限制和控制。
这样,您可以在物理独立的服务器/机器上托管 Web 服务(不必是 web service - 它可以是 Windows 窗体的应用程序将通过 .NET remoting 或 WCF 与之通信的远程应用程序) do 使用 perimeter security 完全控制和保护这台机器。
您在这台安全机器上运行的应用程序和服务可以访问数据库的连接字符串,并且这个连接字符串永远不需要泄露到这台机器的边界之外,从而保持它完全安全(假设上述边界安全措施到位且有效)。
当然,实现所有这些几乎肯定意味着对您的应用程序进行巨大的架构更改,这取决于您的应用程序的大小和性质,可能值得也可能不值得,但是,这是真正保护您的连接字符串免受攻击的唯一方法user(或用户的机器)是为了确保它永远不会(以加密或解密的形式)对用户(或用户的机器)可用。
一旦您将连接字符串放在用户的机器上,即使处于加密状态,您也需要赋予同一台机器解密该加密连接字符串的能力,并且链中存在薄弱环节以及 (对于足智多谋的用户)可以确定您的纯文本连接字符串。您可以将加密连接字符串的解密卸载到另一台(安全)机器上,但这只是前面提到的客户端 - 服务器机制的一种变体,其中执行保持安全的部分(解密 key 、连接字符串等)在您自己的安全控制下的另一台机器上。
关于sql-server - 保护连接字符串免受中间人的攻击,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1073174/