我正在开发一个.NET Windows应用程序,该应用程序将使用Process.Start启动在同一台PC上运行的另一个内部开发的.NET应用程序。我需要将数据库连接信息(包括用户ID和密码)传递给目标应用程序。我正在尝试确定在发送之前是否需要加密信息。
假设最终用户的PC没有受到损害,如果我在参数中未加密地传递连接信息,它是否会暴露在任何地方?
这样的事情会好吗......
string myExecutable = "myApp.exe";
string server = "myServer";
string database = "top_secret_data";
string userID = "myUser";
string password = "ABC123";
string dbInfo = string.Format("server={0} database={1} userID={2} password={3}", server, database, userID, password);
ProcessStartInfo startInfo = new ProcessStartInfo(myExecutable, dbInfo);
Process.Start(startInfo);
或者我应该使用这样的东西......
var crypto = new MySymmetricCryptoLib.Crypto();
string myExecutable = "myApp.exe";
string server = crypto.Encrypt("myServer");
string database = crypto.Encrypt("top_secret_data");
string userID = crypto.Encrypt("myUser");
string password = crypto.Encrypt("ABC123");
string dbInfo = string.Format("server={0} database={1} userID={2} password={3}", server, database, userID, password);
ProcessStartInfo startInfo = new ProcessStartInfo(myExecutable, dbInfo);
Process.Start(startInfo);
答案 0 :(得分:4)
检索调用进程的参数非常简单,因此它们将在本地公开给具有技术头脑的用户。如果这对您来说不是问题,那么我不会担心,因为您说您没有通过网络传输,而您的问题要求我们假设机器没有受到损害。
答案 1 :(得分:2)
从您的问题中不清楚您是在尝试保护数据。这很令人困惑,因为你说“假设PC没有受到损害”。
如果您在机器上启动本地进程并且机器没有受到损害,那么有什么可以保护?在这种情况下,没有任何东西可以遍历网络,所以没有人可以监视这些争论。
但是,如果您担心可能对计算机具有管理访问权限的用户或可能会看到数据的用户,那么您必须加密它。可以很容易地看到进程的命令行参数。任何半合格的用户都可以找到它们。
答案 2 :(得分:1)
我会加密整个字符串而不是单个部分,你基本上告诉一个错误的用户嘿这里的连接信息只是继续并打破它。另一种选择是在其他应用程序启动后传递参数。
当您的建筑安全措施确定攻击是什么(获取对数据库的连接信息的访问权限)以及将要发出攻击的人时,这一点很重要。您是否试图阻止本地用户获取此信息?您是要阻止普通用户还是专家用户?
例如,专家可以继续并转储进程的内存,并找到未加密的字符串。
答案 3 :(得分:1)
使用命名管道并在其上适当地设置ACL,然后让子进程继承句柄 - 不用担心加密。
答案 4 :(得分:0)
由于您必须修改接收应用以进行解密,为什么不修改接收应用以从配置文件中读取,然后encrypt the config file。如果您需要将不同的值传递给其他应用程序,为什么不传递connectionString键?