2014-07-01 163 views
0

我正在開發一個Windows桌面程序。該程序將連接到遠程SQL服務器。它有一個三層架構。所以該解決方案包含幾個ClassLibraries以及一個主Windows窗體應用程序。我不覺得安全使用像這樣的連接字符串:加密連接字符串

string connStr = "Data Source=94.xx.xxx.xx; Initial Catalog=xxxxx; User Id=xxxxx; Password=xxxxx"; 

這樣使用安全嗎?是否有人可以反編譯「.exe」文件並訪問此連接字符串?我知道我可以使用app.config文件。但我沒有導入「ConfigurationManager」,無法使用「ConfigurationManager.ConnectionStrings [」xxx「]。ConnectionString.ToString();」碼。除此之外,它也不安全。我認爲,最好的做法是加密連接字符串。我發現了一個例子:

http://www.codeproject.com/Articles/18558/Encrypting-windows-application-connection-strings

但它使用Visual Studio中的舊版本。我無法弄清楚如何添加一個「包含項目主要輸出的自定義操作的安裝項目」。

有沒有其他的方法可以安全地在3層體系結構的Windows窗體應用程序中使用連接字符串?

PS:我使用Visual Studio Express的2013年Windows桌面

+4

但是,實際上,將應用程序或計算機中的某些密鑰安全存儲的唯一方法是根本不存儲它們。 –

回答

1

無法在機器上隱藏連接字符串。任何相反的建議是蛇油。加密將無濟於事。您運行應用程序的機器上的本地管理員將輕易地擊敗所有可能的方案。本地管理員將始終可以訪問您的本地加密密鑰,而不管您嘗試設計保護的方式如何。

無論您如何試圖隱藏名稱和密碼,部署使用嵌入名稱和密碼連接到公共SQL Server的應用程序都是徒勞無益的。

更好的立場是部署使用用戶輸入的名稱和密碼(登錄對話框)進行連接的應用程序。顯然,每個應用程序用戶使用不同的SQL用戶/密碼。但是,由於每個用戶的名稱/密碼維護都無法管理,因此這種情況在任何中型部署中都會崩潰。

體面的解決方案是使用集成身份驗證,但只適用於域(即公司)。如果您的應用程序要在域(或森林)內分發,在一家公司中,集成身份驗證是實現它的正確方法。

如果您將應用程序分發給公共應用程序,並且您的應用程序需要通過公共互聯網「聯繫家中」並連接到SQL Server,那麼您需要返回到繪圖板。它永遠不會工作,安全問題是不可能解決的。您必須將您的應用程序連接到服務接口(REST,SOAP)並通過您首選的身份驗證方法(表單,oauth)對其進行身份驗證。毋庸置疑,如果您使用直接SQL連接(EF,Linq,ADO.NEt)對應用程序進行編碼,這一切都將耗盡,您必須從頭開始創建一個新應用程序。

+0

幸好我現在只是在設計應用程序。我將嘗試SOAP方法。糾正我,如果我錯了,我應該建立一個這種方法的Web服務和Web服務將處理請求?所以我所有的數據訪問層應該去一個網絡域? Web服務應該處理所有數據庫查詢? – MilesDyson

+0

查看[在30分鐘內爲StackOverflow創建包括XML和JSON的OData API](http://www.hanselman.com/blog/CreatingAnODataAPIForStackOverflowIncludingXMLAndJSONIn30Minutes.aspx)以開始。 –

0

你要打開VS命令提示符,然後寫下面提到的命令。

用於加密

aspnet_regiis -pe connectionStrings -app /VirtualDirectioryPath -prov DataProtectionConfigurationProvider 

ASPNET_REGIIS -pef "connectionStrings" "D:\IIS\admin.mySite.com" 

用於解密

aspnet_regiis -pd connectionStrings -app /VirtualDirectioryPath 

ASPNET_REGIIS -pdf "connectionStrings" "D:\IIS\admin.mySite.com"