为什么将SecureString和ProtectedMemory放在不同的程序集和名称空间中?

时间:2018-12-07 11:14:45

标签: .net dpapi .net-security

从概念上讲,SecureString看起来像是ProtectedMemory的特化。

它的主要功能是缩短RAM,交换和崩溃转储中的(不可变)字符串的寿命。但是,它也使用DPAPI保护除入口点和出口点之外的数据。 DPAPI使用加密技术来完成其工作。那么为什么将SecureString放置在System.Security中而不是System.Security.Cryptography中?

我认为,如果在实现中未使用加密技术,那么SecureString将仅在现有StringBuilder之上提供最小的便利性。

SecureString和ProtectedMemory类名中的“安全”与“受保护”之间也存在对比,我也不知道这可能是出于什么目的。

1 个答案:

答案 0 :(得分:0)

我刚刚发现SecureString不会对.NET Core中的内部存储进行加密; SecureString不应在新开发中使用(DE0001);而且除非我通过SecureStringMarshal.SecureStringToGlobalAllocUnicode中取出字符串,否则即使在.NET的情况下,我仍然始终在托管堆的第0代上始终具有未加密的字符串。因此可以说SecureString基本上只是修饰的StringBuffer,并且其类名所指的“安全性”与可变性有关的多于加密。

Damien_The_Unbeliever在他不再可见的注释中显示,这与两个类的文档记录方式保持一致(自.NET 2以来一直都添加了这两个类):

  

我可以猜测是因为它们处于不同的概念级别上-SecureString承诺保护字符串,但没有说明它是如何做到的。 ProtectedMemory专门说它用于访问DPAPI。一个人可以将另一个(或底层技术)用作实现细节,并不意味着这应该决定它的归属。