亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SecureString在C#應用程序中是否可行?

SecureString在C#應用程序中是否可行?

白衣染霜花 2019-12-09 10:18:25
如果我的假設在這里錯誤,請隨時糾正我,但是讓我解釋為什么我要問。取自MSDN,是SecureString:表示應保密的文本。文本在使用時經過加密以確保隱私,并在不再需要時從計算機內存中刪除。我明白了,將密碼或其他私人信息存儲在SecureString上方是完全有意義的System.String,因為您可以控制將密碼或其他私人信息實際存儲在內存中的方式和時間,因為System.String:既是不可變的,并且在不再需要時不能以編程方式安排進行垃圾回收;也就是說,實例在創建后是只讀的,無法預測何時將實例從計算機內存中刪除。因此,如果String對象包含敏感信息,例如密碼,信用卡號或個人數據,則使用該信息后可能會泄露該信息,因為您的應用程序無法從計算機內存中刪除數據。但是,對于GUI應用程序(例如ssh客戶端),SecureString 必須從構建 System.String。所有的文本控件都使用字符串作為其基礎數據類型。因此,這意味著即使用戶使用密碼掩碼,每次用戶按下一個鍵時,舊的字符串都會被丟棄,而新的字符串將被構建以表示文本框中的值是什么。而且我們無法控制何時或是否從內存中丟棄這些值中的任何一個。現在該登錄服務器了。你猜怎么了?您需要在連接上傳遞字符串以進行身份驗證。因此,讓我們將其SecureString轉換為System.String....現在堆上有一個字符串,無法強制其通過垃圾回收(或將0寫入其緩沖區)。我的觀點是:無論您做什么,SecureString都將被轉換為System.String,這意味著它至少會在某個時刻存在于堆中(不保證任何垃圾回收)。我的意思不是:是否有某種方法可以繞過向ssh連接發送字符串,或者可以避免使控件存儲字符串(創建自定義控件)。對于這個問題,您可以將“ ssh連接”替換為“登錄表”,“注冊表”,“付款表”,“您要喂養的食物,而不是您的孩子的食物”,等等那么,在什么時候使用SecureString實際可行呢?完全消除System.String對象的使用是否值得花費額外的開發時間?是整點SecureString簡單地減少的時間量System.String在堆上(降低其移動到物理交換文件的風險)?如果攻擊者已經具備檢查堆的方法,那么他很可能要么(A)已經具有讀取擊鍵的方法,要么(B)已經物理上擁有了機器 ……因此可以使用SecureString防止他進入的方法。反正數據?這僅僅是“默默無聞的安全”嗎?抱歉,如果我把問題放在太深的地方,好奇心會變得更好。隨時回答我的任何或所有問題(或告訴我我的假設完全錯誤)。:)
查看完整描述

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文檔中都有很好的描述。


查看完整回答
反對 回復 2019-12-09
?
狐的傳說

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)后將其清零。


查看完整回答
反對 回復 2019-12-09
  • 3 回答
  • 0 關注
  • 764 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號