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

我什么时候需要.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 回答

?
烙印99

目前使用的框架的某些部分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
?
米琪卡哇伊

不要使用SecureString


目前的指导说现在不应该使用该类。有关详细信息,请访问以下链接:https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md


来自文章:


DE0001:不应使用SecureString

动机

目的SecureString是避免将秘密存储在进程内存中作为纯文本。

但是,即使在Windows上,SecureString也不存在作为操作系统的概念。

它只是让窗口缩短了纯文本; 它不能完全阻止它,因为.NET仍然需要将字符串转换为纯文本表示。

好处是纯文本表示不会作为一个实例System.String- 本机缓冲区的生命周期更短。

除.NET Framework外,该数组的内容未加密。

在.NET Framework中,内部char数组的内容已加密。由于缺少API或密钥管理问题,.NET不支持所有环境中的加密。

建议

不要SecureString用于新代码。将代码移植到.NET Core时,请考虑数组的内容未在内存中加密。


处理凭据的一般方法是避免使用凭证,而是依赖其他方式进行身份验证,例如证书或Windows身份验证。


结束编辑:下面的原始摘要


很多很棒的答案; 这是对所讨论内容的快速概述。


Microsoft已实施SecureString类,以便为敏感信息(如信用卡,密码等)提供更好的安全性。它自动提供:


加密(在内存转储或页面缓存的情况下)

固定在记忆中

标记为只读的能力(以防止任何进一步的修改)

通过不允许传入常量字符串的安全构造

目前,SecureString的使用受到限制,但预计将来会更好地采用。


根据这些信息,SecureString的构造函数不应该只是取一个字符串并将其切片到char数组,因为拼写的字符串会破坏SecureString的目的。


附加信息:


一个岗位由.NET安全作为这里所涉及官方博客谈论大同小异。

而另一个 重新审视,并提一个工具,可以转储SecureString的内容。

编辑:我发现选择最佳答案很难,因为很多信息很好; 太糟糕了,没有辅助的答案选项。


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

添加回答

回复

举报

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