为了账号安全,请及时绑定邮箱和手机立即绑定

我什么时候需要.NET中的SecureString?

我什么时候需要.NET中的SecureString?

慕勒3428872 2019-08-30 16:47:22
我试图了解.NET的SecureString的目的。来自MSDN:System.String类的实例都是不可变的,当不再需要时,不能以编程方式调度垃圾回收; 也就是说,实例在创建后是只读的,并且无法预测实例何时从计算机内存中删除。因此,如果String对象包含敏感信息(如密码,信用卡号或个人数据),则使用该信息后可能会显示该信息,因为您的应用程序无法从计算机内存中删除该数据。SecureString对象类似于String对象,因为它具有文本值。但是,SecureString对象的值会自动加密,可以修改,直到您的应用程序将其标记为只读,并且可以通过应用程序或.NET Framework垃圾收集器从计算机内存中删除。初始化实例或修改值时,SecureString实例的值会自动加密。您的应用程序可以呈现实例不可变,并通过调用MakeReadOnly方法防止进一步修改。自动加密是最大的收益吗?为什么我不能说:SecureString password = new SecureString("password");代替SecureString pass = new SecureString();foreach (char c in "password".ToCharArray())    pass.AppendChar(c);我错过了SecureString的哪个方面?
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

我会停止使用SecureString。看起来PG家伙正在放弃对它的支持。可能甚至在将来拉它 - https://github.com/dotnet/apireviews/tree/master/2015-07-14-securestring。


我们应该在.NET Core中的所有平台上从SecureString中删除加密 - 我们应该废弃SecureString - 我们可能不应该在.NET Core中公开SecureString


查看完整回答
反对 回复 2019-08-30
?
烙印99

TA贡献1829条经验 获得超13个赞

目前使用的框架的某些部分SecureString:


WPF的System.Windows.Controls.PasswordBox控件在内部将密码保存为SecureString(作为副本公开PasswordBox::SecurePassword)

该System.Diagnostics.ProcessStartInfo::Password物业是一个SecureString

用于X509Certificate2获取SecureString密码的构造函数

主要目的是减少攻击面,而不是消除它。SecureStrings在RAM中被“固定”,因此垃圾收集器不会移动它或复制它。它还确保纯文本不会写入Swap文件或核心转储中。加密更像是混淆,并且不会阻止确定的黑客,谁能够找到用于加密和解密它的对称密钥。


正如其他人所说的那样,你必须创建一个SecureString逐个字符的原因是因为第一个明显的缺点:你可能已经将秘密值作为一个普通的字符串了,那么重点是什么?


SecureStrings是解决Chicken-and-Egg问题的第一步,因此即使大多数当前场景需要将它们转换回常规字符串以完全使用它们,它们在框架中的存在现在意味着更好地支持它们。未来 - 至少到你的程序不一定是薄弱环节的地步。


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 976 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信