這是我卑微的意見。
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解密爲純文本,並將其公開給內存。如果您不調用密碼屬性,並且不通過在軟件工具中進行檢查來調用密碼,則密碼不會以純文本形式顯示在內存中。
那麼,您的'PasswordBox'的屬性是否綁定到視圖模型? – torvin
@torvin: \t 我不綁定到PasswordBox。由於安全考慮,它沒有可綁定的密碼屬性,所以,正如我所說的,我在代碼隱藏中處理PasswordChanged事件。我只是將DataContext投影到我的視圖模型類型並更新其密碼屬性。 – Andikki
您應該在視圖模型中將您的'PasswordBox.SecurePassword'屬性綁定到'SecureString'類型的屬性。這樣就可以防止內存掃描(這是'SecureString'的目的)。 – torvin