何时需要在.NET中使用SecureString?

186

我试图理解.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的方面?


8
11年后,微软不再推荐使用SecureString进行新开发:https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md - Matt Thomas
11个回答

1
另一个用例是当您使用付款应用程序(POS)并且您只是无法使用不可变数据结构来存储敏感数据,因为您是一位谨慎的开发者。例如:如果我将敏感卡数据或授权元数据存储到不可变字符串中,那么在此数据被丢弃后,它将始终在内存中可用相当长的时间。我不能简单地覆盖它。另一个巨大的优势是将这些敏感数据加密保存在内存中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接