3

我的自定义 .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();

欢迎对该技术的任何其他评论。谢谢。

4

1 回答 1

0

在您的情况下,使用 SecureString 不会很有用。

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

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

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

于 2015-11-13T20:40:17.877 回答