2015-09-24 20 views
8

PasswordBox.Passwordmsdn documentation說:密碼是否顯示PasswordBox.Password屬性?

當你的密碼屬性值,你在內存明文暴露的密碼。爲避免這種潛在的安全風險,請使用SecurePassword屬性將密碼作爲SecureString獲取。

所以我送SecurePassword到我的視圖模型上PasswordChanged事件,希望一切是安全的,但如果我視察PasswordBox的Password財產我有史努比的應用程序,我看到我以純文本輸入的密碼。這不會殺死使用SecurePassword的全部目的嗎?還有什麼我應該在這裏保護密碼嗎?

+0

那麼,您的'PasswordBox'的屬性是否綁定到視圖模型? – torvin

+0

@torvin: \t 我不綁定到PasswordBox。由於安全考慮,它沒有可綁定的密碼屬性,所以,正如我所說的,我在代碼隱藏中處理PasswordChanged事件。我只是將DataContext投影到我的視圖模型類型並更新其密碼屬性。 – Andikki

+0

您應該在視圖模型中將您的'PasswordBox.SecurePassword'屬性綁定到'SecureString'類型的屬性。這樣就可以防止內存掃描(這是'SecureString'的目的)。 – torvin

回答

5

這是我卑微的意見。

Snoop在運行應用程序中注入其代碼。所以,它基本上是一個黑客工具。一個非常易於使用的黑客工具,只適用於您的GUI。 這就是爲什麼簡單地改變任何項目的可見性來隱藏用戶的一些數據是一個不好的secsec性desicion。關於限制,訪問和安全的一切不應該在UI層處理。在How to Snoop proof your wpf application?上有很多方法,但主要的答案是你必須以某種方式設計你的應用程序,這種方式不允許snoop違反任何事情。例如,驗證服務器上的所有內容。

回到你的問題:

有兩種情況。首先是:用戶創建一個密碼。我相信這不是一個問題,如果用戶或用戶的惡意軟件此時會看到密碼。然後你收到並存儲安全的字符串。並清除用戶的密碼。

第二種情況:您向用戶顯示存儲的密碼。訣竅是 - 你不顯示它。你知道密碼的長度,所以你可以用****顯示剛剛禁用的文本框。如果用戶想要更改密碼 - 您可以給他提供實際的密碼箱,他必須填寫舊密碼和新密碼,然後回到場景#1。

一線希望是:

當用戶輸入密碼,這不是一個大問題,它躺在某處以明文形式在存儲器中,因爲用戶知道什麼he've類型和惡意軟件可以追蹤按下鍵。

後你存儲的密碼,您永遠還給用戶


更新:這是一個密碼箱的密碼屬性的源代碼

public string Password 
     { 
      [SecurityCritical] 
      get 
      { 
       string password; 

       using (SecureString securePassword = this.SecurePassword) 
       { 
        IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(securePassword); 

        try 
        { 
         unsafe 
         { 
          password = new string((char*)ptr); 
         } 
        } 
        finally 
        { 
         System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(ptr); 
        } 
       } 

       return password; 
      } 

所以,我猜MSDN在說什麼,就是每當你通過代碼調用密碼(或者在調試時在VS中查看它,或者將它看成是Snoop),你就稱它爲get方法,wh ich將SecuredString解密爲純文本,並將其公開給內存。如果您不調用密碼屬性,並且不通過在軟件工具中進行檢查來調用密碼,則密碼不會以純文本形式顯示在內存中。

+0

這是否意味着窺探視覺樹或攔截擊鍵被認爲比從內存中嗅出密碼字符串更難以惡意軟件? – Andikki

+1

@Andikki,我不是一個開發惡意軟件的專家,但是對於被認爲困難得多的單詞有些困惑。在PasswordBox MS中,安全密碼不會以純文本形式出現在內存中,除非您或其他人稱其密碼屬性。他們可以更多地保護它嗎?他們應該有嗎? – netaholic

+0

我對安全知之甚少,所以我的問題一定是天真的。但是我想確保我正在實施授權表單這樣的通用元素。試圖理解爲什麼你應該採取預防措施,不要把你的密碼放在內存中,同時不應該因爲有一個可訪問的密碼泄露屬性而被打擾。我可以想象一種情況,用戶發送內存快照來支持,而不知道他在泄漏他的密碼。我們在這裏保護這種東西嗎? – Andikki