2009-12-17 72 views
5

我想使用SecureString來保存數據庫的連接字符串。但是,只要將SqlConnection對象的ConnectionString屬性設置爲securestring的值,那麼對於能夠讀取我應用程序內存的任何其他應用程序而言,它肯定會變得可見?使用securestring進行sql連接

我已經作出以下假設:
a)本人不能夠實例管理存儲器
b)中管理的存儲器內的任何串的外SqlConnection對象可以由一個應用程序如Hawkeye

+2

顯然鷹眼1.2.0可以顯示SecureStrings ......那麼,什麼是你的問題? – 2009-12-17 15:07:24

+1

噢 - 那麼在securestrings有什麼意義呢? – Richard 2009-12-17 15:08:35

回答

3

絕對正確的是,當您需要將字符串傳遞給託管API時,例如設置ConnectionString,SecureString不會爲您提供任何好處。

它的確是專門爲安全的非託管API進行安全通信而設計的。

微軟理論上可以考慮加強SqlConnection對象支持安全的ConnectionString,但我認爲他們是不可能這樣做的原因是:

  • SecureString的真的只有在客戶端應用程序,例如有用的地方密碼是從用戶輸入字符逐個建立的,而不需要在管理字符串中具有整個密碼。

  • 在這樣的環境中,使用Windows身份驗證連接到SQL Server更爲常見。

  • 在服務器上還有其他方法來保護SQL Server憑據,首先將對服務器的訪問限制爲授權管理員。

+3

使用SQL Server身份驗證時,.NET 4.5將允許將密碼作爲SecureString傳遞:[ADO.NET 4.5中的新增功能](http://msdn.microsoft.com/zh-cn/library/ex6y04yf(v = vs.110).aspx) – 2011-11-19 04:00:57

+0

我的意見是,SecureString適用於以安全方式進行所有類型的機密通信,而不限於非託管API。 Per Lee SecureString受.NET 4.5支持。我個人在企業支持工程環境中工作,其中最低級別的支持可能有權訪問SQL中的某些數據,但未被授予知道什麼是SQL用戶的密碼。相反,這個祕密是事先用證書加密的,並且程序被授權使用證書而不是用戶。 – 2015-04-01 16:39:27

+0

@DavidBurg - 我不明白你的觀點。 SqlConnection.ConnectionString仍然不使用.NET 4.5中的SecureString。如果您可以避免使用密碼,那麼顯然這是一個更好的解決方案,但情況並非總是如此。而使用證書進行身份驗證的程序不需要SecureString。 – Joe 2015-04-01 19:33:24

0
讀取

如果您擔心安全問題,我建議您應在SQL服務器中啓用SSL並使用SSL與SSL進行通信。

+2

雖然連接密碼仍然不會在內存中? – 2009-12-17 15:21:13

+0

@JonB @Shamika是的,我想也是這樣 – Richard 2009-12-17 15:44:24

+0

我沒有看到使用SSL與這個問題有什麼關係。 – Joe 2009-12-17 18:17:55

0

爲什麼連接字符串是一個問題?密碼是不是你想要保護的(除非你把密碼放在連接字符串裏,這對我見過的所有驅動程序來說都是可選的)。話雖如此,密碼通常必須在某些時候在內存中「清晰」(除非驅動程序有一些允許加密密碼的api,但實際上這可能實際上並不會有太大幫助)。

通常這不是問題,因爲進程處於安全環境中,如在Web服務器上,或作爲系統管理員帳戶類型運行(因此普通用戶無法訪問進程內存),或通常都是這兩種情況。如果這是在用戶端運行的客戶端計算機上,則必須假定該進程無論如何都會受到影響,這無濟於事。一旦你確保了這個過程,你就不必擔心這樣的事情。

0

將SecureString值分配給SQLConnection.ConnectionString將繞過安全性,使其無用。

一個SecureString的是爲了解決這些正常的字符串問題,ref

  • 不固定,垃圾收集器可以移動它,離開副本在內存
  • 沒有加密
  • 如果你的進程被換在磁盤中,該字符串將位於交換文件中
  • 不可變,修改它將保持舊版本和新版本都在內存中
  • n o清除它的方式當你使用它

恕我直言,SecureString類型是一個僞劣安全實現的補丁,目前SecureString並沒有在整個框架內實現,所以它的好處可以'完全可以使用。

我有同樣的問題,我選擇存儲敏感信息的RSA加密。

另一種解決方案是通過數據庫服務器上的服務託管數據訪問層,並且服務在本地系統帳戶下運行,該服務連接到數據庫並提供數據,而本地用戶無法訪問服務配置。

+0

隨着新版本的。NET,SecureString實現更全面,使原始響應有點過時。 – 2015-04-01 16:42:51