3 回答

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

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果滿(mǎn)足以下條件,則SecureString很有用:
您可以逐個(gè)字符地構(gòu)建它(例如從控制臺(tái)輸入中)或從非托管API中獲取它
您可以通過(guò)將其傳遞給非托管API(SecureStringToBSTR)來(lái)使用它。
如果將其轉(zhuǎn)換為托管字符串,那么您就無(wú)法實(shí)現(xiàn)它的目的。
更新以回應(yīng)評(píng)論
...或您提到的BSTR,似乎再安全不過(guò)了
將其轉(zhuǎn)換為BSTR后,使用BSTR的非托管組件可以將內(nèi)存清零。從某種意義上講,非托管內(nèi)存可以重置,因此更加安全。
但是,.NET Framework中很少有支持SecureString的API,因此您可以說(shuō)它今天的價(jià)值非常有限。
我將看到的主要用例是在客戶(hù)端應(yīng)用程序中,該應(yīng)用程序要求用戶(hù)輸入高度敏感的代碼或密碼。可以逐個(gè)字符地使用用戶(hù)輸入來(lái)構(gòu)建SecureString,然后可以將其傳遞給非托管API,該API在使用后將收到的BSTR清零。任何后續(xù)的內(nèi)存轉(zhuǎn)儲(chǔ)將不包含敏感字符串。
在服務(wù)器應(yīng)用程序中,很難看到它在哪里有用。
更新2
接受SecureString的.NET API的一個(gè)示例是X509Certificate類(lèi)的此構(gòu)造方法。如果您對(duì)ILSpy或類(lèi)似內(nèi)容不滿(mǎn)意,則會(huì)發(fā)現(xiàn)SecureString在內(nèi)部轉(zhuǎn)換為非托管緩沖區(qū)(Marshal.SecureStringToGlobalAllocUnicode),然后在完成(Marshal.ZeroFreeGlobalAllocUnicode)后將其清零。
- 3 回答
- 0 關(guān)注
- 775 瀏覽
添加回答
舉報(bào)