我在C#/ WPF中创建了一个桌面应用程序,它通过代码中指定的常量连接字符串连接到SQL Server 2008实例,如下所示(用于测试目的):
private string GetConnectionString()
{
//test
return "Data Source=[server IP]; Initial Catalog=[database name]; User ID=[user ID]; Password=[smart password];";
}
该应用程序将由各种用户使用,并将通过ClickOnce,.zip存档或自定义安装程序进行部署。它还通过请求应用程序访问用户名和密码来分离自定义登录功能。
存储桌面应用程序(IP,数据库,SQL Server用户,密码)的连接字符串详细信息的最佳做法是什么?如果连接字符串在夜间更改,这是更新它的最佳方法,而不强制用户更新到我的应用程序的最新版本?用户不应该能够看到/拦截/反编译连接字符串,所以我想我必须使用某种加密。 我对你的询问有什么建议吗?
答案 0 :(得分:5)
即使您将连接字符串编译到应用程序中,仍然可以使用Ildasm.exe
(MSIL反汇编程序)工具查看它们,因为字符串是程序集元数据的一部分。
也许this question可以帮到你。
答案 1 :(得分:3)
在桌面应用程序中,您无法阻止确定的用户查看连接字符串。即使您使用加密,确定的用户也可以找到并使用加密密钥。
答案 2 :(得分:2)
如果客户端连接到数据库,则可能会破坏连接。
这是App.Config中的连接数据示例
<appSettings>
<add key="dbServer" value="svr"/>
<add key="dbDataBase" value="db1"/>
<add key="dbUser" value="sharedUser"/>
<add key="dbPassword" value="easyPassword"/>
</appSettings>
需要引用system.configuration
string SvrName = ConfigurationManager.AppSettings["dbServer"];
string DBName = ConfigurationManager.AppSettings["dbDataBase"];
string DBUser = ConfigurationManager.AppSettings["dbUser"];
string DBPassword = ConfigurationManager.AppSettings["dbPassword"];
至于安全性,答案是2层应用程序,其中只有安全服务器端代码连接到数据库。此代码示例来自服务器端代码。
服务器端的其他好处是来自同一连接的重复查询可以从先前查询的内存索引中获得。
您可以对从AppSettings读取的密码进行加盐和散列并对应用程序进行模糊处理,但您必须使用静态盐才能被黑客攻击。这只会减慢黑客的速度。
答案 3 :(得分:1)
您需要在应用程序中添加“应用程序设置”文件。只需右键单击您的解决方案 - &gt;添加 - &gt;找到与“app configuration”类似的东西。为此,您需要某种外部配置文件来存储连接字符串。你甚至可以使用一个简单的文件。如果担心人们找到该文件,您可以随时加密该字符串并在您的应用中对其进行解密。
答案 4 :(得分:1)
我的观点是,最安全的解决方案是将当前的DNS入口指向当前的SQL计算机并将身份验证设置为 Windows身份验证。
例如:SQLMACHINE主机名在DNS服务器中指向192.168.1.3。
这样,如果SQL计算机的名称/ IP发生更改,则只需更新DNS服务器(可能还会使本地DNS缓存失效)。
拥有Windows身份验证意味着本地计算机上不会存储密码,因此您可以安全地将连接字符串存储在.config文件中,而无需担心。
我的2欧元。