所以這個類似乎很少使用:SecureString。至少從2.0版開始,有幾個SO問題,但我想我會問自己的具體問題:安全使用SecureString登錄表格
我有一個LoginForm;帶有用戶名和(被屏蔽的)密碼字段的簡單WinForms對話框。當用戶同時輸入並單擊「登錄」時,信息被傳遞給一個注入的認證類,它執行一層密鑰擴展,然後將一半的擴展密鑰用於驗證,而另一半則是加密用戶的對稱密鑰賬戶數據。當所有這些都完成後,loginForm關閉,處理驗證器類,然後系統繼續加載主表單。相當標準的東西,可能比標準的hash-the-password-and-compare有更多的參與,但是簡單的散列密碼在我的情況下會以明文方式存儲用戶數據,因爲這些數據包括第三方密碼,第三方系統(我們都知道人們喜歡重複使用密碼)。
這是第一個問題;我將如何使用SecureString從密碼文本框中檢索密碼,而不是它通過文本框的Text屬性顯示爲普通的System.String?我假設有一種方法可以訪問由CLR類包裝的文本框的非託管GDI窗口,並使用Marshal類拉取文本數據。我只是不知道如何,我似乎無法找到好的信息。
這是第二個問題;一旦我將密碼作爲SecureString使用,我如何將它從System.Security.Crypto命名空間傳遞給哈希提供程序?我的猜測是,我會使用Marshal.SecureStringToBSTR(),然後Marshal.Copy()從返回的IntPtr返回到一個字節數組。然後,我可以調用Marshal.ZeroBSTR()來清理非託管內存,並且一旦有散列,我就可以用Array.Clear()清零託管數組。如果有一種更清晰的方式可以讓我完全控制內存中任何託管副本的生命週期,請告訴。
第三個問題;所有這些都是非常必要的,或者是在託管內存環境中System.String固有的不安全性有點過分?任何用於存儲密碼,加密或其他方式,應該超出了作用域,並且在操作系統考慮將應用程序交換到虛擬內存之前就已經到達垃圾收集器的路上了(允許從交換文件中嗅探密碼在計算機硬關機後)。冷啓動攻擊是一種理論上的可能性,但真的,這有多常見?更大的擔憂是現在解密的用戶數據,作爲整個應用程序生命週期的用戶的一部分而掛起(因此,除了一些基本用法,它們保持相當休眠狀態外,它們將成爲使用SecureStrings的主要候選項)。
這個想法是減少攻擊面。例如,如果攻擊者無法讀取內存,但可以訪問交換文件,SecureString可以提供幫助。我們無法預測攻擊者可以做什麼或不可以做什麼,所以我們試圖讓事情變得非常困難。但是,沒有任何保護措施會有幫助:如果應用程序知道這些信息 - 攻擊者可能也可以。 –
我猜對於'SecureString'的最佳論據是開發人員的時間最好花在其他地方。 – usr
好吧,我不必相信攻擊者可以看到輸入的字符,相信攻擊者可以提取交換文件。複雜程度和要求的訪問水平是非常不同的。所以,我可以預見SecureString的一個優勢是在一個不需要過多設計的情況下需要長期保存在內存中的敏感數據(比如前面提到的第三方系統憑證,只要應用程序能夠運行並且最終可以結束交換文件)。但我認爲我同意你的觀點,即10倍中的9倍比它的價值更麻煩。 – KeithS