如果我的假设是错误的,请随时纠正我,但让我解释为什么我问。
取自 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
在堆上的时间(减少其移动到物理交换文件的风险)?SecureString
会阻止他获取数据吗?如果我的问题问得太过分了,对不起,我只是被好奇心控制了。请随意回答我的任何或所有问题(或者告诉我我的假设是完全错误的)。:)