3 回答

TA貢獻1789條經驗 獲得超10個贊
假設中的幾個問題。
首先,SecureString類沒有String構造函數。為了創建一個,您分配一個對象,然后追加字符。
對于GUI或控制臺,您可以非常輕松地將每個按下的鍵傳遞給安全字符串。
該類的設計方式是您不能錯誤地訪問所存儲的值。這意味著您不能string直接從中獲取as作為密碼。
因此,例如使用它來通過Web進行身份驗證時,您將必須使用同樣安全的適當類。
在.NET Framework中,您可以使用一些類來使用SecureString
WPF的PasswordBox控件在內部將密碼保留為SecureString。
System.Diagnostics.ProcessInfo的Password屬性是SecureString。
X509Certificate2的構造函數使用SecureString作為密碼。
總而言之,SecureString類可能很有用,但需要開發人員更多的注意。
所有這些以及示例,在MSDN的SecureString文檔中都有很好的描述。

TA貢獻1804條經驗 獲得超3個贊
如果滿足以下條件,則SecureString很有用:
您可以逐個字符地構建它(例如從控制臺輸入中)或從非托管API中獲取它
您可以通過將其傳遞給非托管API(SecureStringToBSTR)來使用它。
如果將其轉換為托管字符串,那么您就無法實現它的目的。
更新以回應評論
...或您提到的BSTR,似乎再安全不過了
將其轉換為BSTR后,使用BSTR的非托管組件可以將內存清零。從某種意義上講,非托管內存可以重置,因此更加安全。
但是,.NET Framework中很少有支持SecureString的API,因此您可以說它今天的價值非常有限。
我將看到的主要用例是在客戶端應用程序中,該應用程序要求用戶輸入高度敏感的代碼或密碼??梢灾饌€字符地使用用戶輸入來構建SecureString,然后可以將其傳遞給非托管API,該API在使用后將收到的BSTR清零。任何后續的內存轉儲將不包含敏感字符串。
在服務器應用程序中,很難看到它在哪里有用。
更新2
接受SecureString的.NET API的一個示例是X509Certificate類的此構造方法。如果您對ILSpy或類似內容不滿意,則會發現SecureString在內部轉換為非托管緩沖區(Marshal.SecureStringToGlobalAllocUnicode),然后在完成(Marshal.ZeroFreeGlobalAllocUnicode)后將其清零。
添加回答
舉報