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

时间:2015-11-13 20:10:25

标签: c# securestring dpapi

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

欢迎任何关于该技术的其他评论。感谢。

1 个答案:

答案 0 :(得分:0)

在您的情况下使用SecureString不会非常有用。

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

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

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