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)后将其清零。
添加回答
举报