在这种情况下使用 SecureString 会提高安全性吗?

Would using SecureString in this situation improve security?

我的自定义 .Net 进程使用与当前上下文不同的帐户映射驱动器。密码存储在配置文件中,使用机器密钥加密的 DPAPI。

代码有效,但我想知道使用 SecureString 是否会提供额外的安全性。我认为下面的弱点在于 PlainBytes 数组以及 MapPwd 和 MapDriveCmd 字符串,当它们以纯文本形式存在于内存中时。

我对 SecureString 做了一些研究,但不太明白它是否适用于此。以下代码后未使用三个局部可疑变量。如果我在没有 SecureString 的情况下保持原样,车库收集器会在流程结束前处理这些吗?

byte[] CipherBytes = Convert.FromBase64String(ConfigurationManager.AppSettings.Get("MapPwd").Trim());
byte[] PlainBytes = ProtectedData.Unprotect(CipherBytes, null, DataProtectionScope.LocalMachine);
string MapPwd = System.Text.Encoding.UTF8.GetString(PlainBytes);

string MapDriveCmd = "/C net use " + MapLetter + " " + MapPath + " " + MapPwd + " /USER:" + MapUser + " /PERSISTENT:NO";
System.Diagnostics.Process MapDrive = System.Diagnostics.Process.Start("CMD.exe", MapDriveCmd);
MapDrive.WaitForExit();

欢迎对一般技术提出任何补充意见。谢谢

使用 SecureString 对您的情况没有多大好处。

SecureString 的目的是提供一种在不再需要时对数据进行垃圾收集的方式,这样数据就不会在 RAM 中逗留。如果数据被保留下来,有人可以使用调试器(或其他类似方法)来检查进程分配并可能获得结果。

DPAPI 根本不是很安全。这还不错……但它是一种 可逆 算法。使用单向散列算法要好得多。但是,在此用例中您不能这样做。由于您使用的是 DPAPI,PC 的任何其他用户都可能能够读取您的配置文件。如果他们可以读取配置文件,并且由于您使用的是机器密钥,则只需调用 ProtectedData.Unprotect()

即可轻松解密您的密码

为了更安全,不要使用密码。如果可能,将权限授予 AD 机器帐户或托管服务帐户。