2014-09-03 72 views
13

在我的WPF應用程序中,我希望允許管理員使用各種其他用戶的集成安全性測試數據庫連接。所以我有一個表單,允許管理員輸入域名,用戶名和密碼,然後對其進行測試。我能夠安全地處理密碼的權利,直到我在這需要一個string password安全的Windows模擬?

LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle) 

我已經寫了效用函數的SecureString的轉換爲字符串儘可能安全,然後即時通話的advapi32.dll調用LogonUser它在LogonUser的調用密碼:

LogonUser(UserName, Domain, Helper.ConvertSafely(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref UserHandle) 

由於對LogonUser的簽名需要一個字符串,除非LogonUser的正在於它的執行密碼的適當的照顧,他仍然可以是後以純文本我的調用堆棧通話返回。有沒有更安全的方式來模仿一個用戶,在這個用戶中,我可以知道密碼是安全的嗎?

基本上所有我需要的是一個WindowsImpersonationContext,但我想贏得密碼永遠不會以純文本。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2014-09-05 19:17:03

+0

其實問題不錯。但是,如果您真的關心安全性,那麼我建議您也考慮非技術性安全漏洞:您的管理員不得擁有或不要求瞭解您的用戶密碼。您創建用戶名/密碼屏幕的事實表明管理員將輸入用戶憑證。這對我來說似乎是非常錯誤的。 (如果不是管理員,而是用戶自己,誰將填寫他們的憑證,那麼只需在他們自己的登錄名下申請RUNAS,這樣你就不需要冒充了。) – stakx 2014-09-05 19:27:06

+0

不會無論如何,原始表單輸入字段使用常規字符串?此外,您可能有興趣使用我的[SimpleImpersonation](https://github.com/mj1856/SimpleImpersonation)庫簡化您的LogonUser代碼,如[此處]所述(http://stackoverflow.com/a/7250145/634824)。儘管我也沒有使用'SecureString'。 – 2014-09-05 19:44:13

回答

4

如果你想冒充用戶(在另一個會話爲例)已經登錄到計算機上,這裏是一個答案:Is it possible for a Windows service impersonate a user without a password?

如果他不在,你就必須要LogonUser的提供密碼。因爲這是LogonUser定義的方式,所以此密碼必須至少在內存中保留少量時間。請注意,並非所有auth軟件包都需要密碼(如生物識別或智能卡:Windows Authentication Overview)。

所以,如果你真的想模仿,在某個地方你必須傳遞密碼。在這種情況下,請確保您使用Microsoft的postlagerkarte代碼:Marshal.SecureStringToGlobalAllocUnicode Method sample code

您無法真正做得更多。

6

在託管應用程序中,您可以使用SecureString類來處理敏感信息。通常不需要推出自己的安全字符串機制。

就在您登錄到LogonUser之前,您將傳遞SecureString密碼的非託管副本 。你使用Marshal.SecureStringToGlobalAllocUnicode方法。因此,在您的應用程序域中永遠不會有代表密碼的託管對象。

您可以在this文章中找到示例代碼。

如果你需要更多的安全性,我建議禁止你的wpf客戶端直接連接數據庫。你可以引入一箇中間層。因此,安全性從客戶端轉移到這臺服務器。客戶端和App-Server之間的通信是加密的,只有應用服務器與數據庫進行通信。

+0

這正是我正在做的,我只是擔心LogonUser調用將離開我手中的堆棧上的不安全的密碼。 – user1336827 2014-09-03 14:12:20

+0

是的,你是對的。你可能想要在你的問題中更清楚。始終可以在API LogonUser條目上設置斷點並轉儲調用堆棧。所以這個問題更多的是圍繞本機LogonUser函數。 – Postlagerkarte 2014-09-03 14:31:58

+0

林不知道我可以讓問題更清楚,我試過。但是,關心的是非託管代碼LogonUser,以及是否有更安全的方法來獲取WindowsImpersonationContext,而不必擔心非託管代碼如何處理密碼,而密碼似乎以純文本形式使用。 – user1336827 2014-09-03 14:40:12

1

更新:

您可以實現加密的app.config。您可以通過幾種不同的方法做到這一點:

那麼如何做到這一點的工作,是當管理員將憑證你會解密app.config修改鍵/值與新的憑據。然後一旦它被插入,它會再次加密配置文件。

因此它的暴露程度最低,而且數據也通過封裝來插入,這有助於隱藏它。

這是一種方法,雖然SecureString將起作用,但預計需要char[]。在通過advapi32.dll接口連接時,在某些情況下可能並不理想。

+0

我很困惑。加密的憑據如何從配置傳遞給LogonUser? – 2014-09-03 14:14:10

+0

我的代碼中的安全性不是問題,密碼存儲在SecureString中,它是當我調用非託管代碼LogonUser時它使用純文本密碼。 – user1336827 2014-09-03 14:25:22

+0

@ user1336827因此,非託管代碼實際上是在純文本中調用它? – Greg 2014-09-03 14:28:55