2011-01-05 63 views
2

我想編寫一個C#應用程序,它需要連接到數據庫並獲取一些信息。我在想,如果我直接在C#應用程序中使用連接字符串,那麼用戶可能很容易獲得連接字符串並直接登錄到我的sql服務器,一旦發生這種情況,他們可以選擇所有他們想要的信息!
那麼有沒有什麼好的解決方案呢?
在此先感謝!我如何保密信息?

回答

1

我其實有類似的要求。我通過使用連接字符串並使用Rijndael加密邏輯對它進行加密來解決它(在System.Security.Cryptography中檢查它)。它非常易於使用。我的一個朋友在過去的19個月裏一直試圖用一系列彩虹表來破解它 - 是的,他手上有太多時間 - 並且告訴我說「我們的太陽系在我之前可能會變黑可以進去。「我笑了。太多的空閒時間。

我只是把我的連接字符串,我存儲在一個XML文件(所以我可以改變它,如果需要)並加密它。我的應用程序作爲其初始化過程的一部分,讀取此值 - 解密它 - 然後連接並打開數據庫。

像「我是一塊數據是被加密的」 .....加密一次結束了類似.....「V27AsTNsJA + BEwoGR2PbiZum5puwiLbfMa41ens8r8sSiEnn6FiT + k8ImEft Qba8ziCpie94s3bEwcPekqRfhO1Noc8lVeERyezmtqN9/0ZgmzJbNbl/3emTLLfb0Qpj」 .. ..這顯然不會對試圖入侵的人非常有用。

值得指出的是,即使使用低128位加密(這也支持256位),請記住有2個提升到128個可能值的功率,或者3.4e + 38。想想多麼龐大的數字是:

340,000,000,000,000,000,000,000,000,000,000,000,000

如果試圖破解這一點,例如,以每秒(1,000,000,000,000 /秒),1次萬億的嘗試率就可能採取你3個億億幾年才能得到它。當然,你可能會在第一次猜測中得到它......但可能不會。

256位密鑰是1.15e + 77,512位密鑰是1.34e + 154個可能值。

+0

就是這樣,我也在做。 – TalentTuner 2011-01-05 03:29:26

+1

在初始化過程中,你說它解密連接字符串。這個解密密鑰是否也存儲在應用程序中,還是由您在運行時鍵入? – Jubal 2011-01-05 04:04:04

+0

@jskaggz - 我真的無法想象嘗試鍵入一個鍵或IV ...你會做錯誤的分配(或至少我會)。它是應用程序本身的一部分,但如果有人試圖對應用程序進行逆向工程以實現這一目的,則會受到混淆。實際上有幾種處理這個問題的方法 - 我可以讓我遠程「推送」新的加密應用程序,因爲加密也用於通信,並且交換加密使得任何人都無法穿透安全。 – BonanzaDriver 2011-01-05 04:31:41

6

解決此問題的唯一方法是三層體系結構,其中您的客戶端軟件不直接連接到數據庫,而是連接到應用程序服務器,該應用程序服務器控制數據庫憑據以及SQL發出的內容。

也可能(不太可能)限制客戶端軟件的數據庫用戶只能選擇客戶端應用程序真正需要的數據(而不是其他任何數據)的權限。通過這種方法,您將創建特定的視圖並僅授予對這些視圖的選擇權限。存儲過程是另一個工具。但是,這可能無法涵蓋所有​​情況,並且在您意外授予太多或數據庫中的錯誤允許特權升級的情況下有點危險。

但是,如果安全是一個問題,我會去三層。

+0

你的意思是我必須編寫一個數據訪問層並在該層上添加訪問控制?那麼每次我需要選擇數據時,我都會首先發送用戶名和密碼,經過授權後我可以獲得我有權限的數據? – MemoryLeak 2011-01-05 03:15:15

1

您需要加密web.config中的連接字符串。這裏去吧Encrypt。此外,使用Windows身份驗證(可信連接= true)。這可以確保即使用戶擁有該憑證,如果未將其ID添加到ActiveDirectory/Domain中,他仍然無法登錄。