我正在开发一个.NET Windows应用程序,它将使用Process.Start启动在同一台PC上运行的另一个内部开发的.NET应用程序。 我需要将数据库连接信息(包括用户标识和密码)传递给目标应用程序。 我试图确定在发送之前是否需要encryption信息。
假设最终用户的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);
检索一个进程被调用的参数非常容易,所以他们将被本地暴露给一个技术敏感的用户。 如果这不是你的问题,那么我不会担心,因为你说你不是通过网络传输,你的问题要求我们假设机器没有受到威胁。
从您的问题上来看,您不清楚保护数据的原因。 这是令人困惑,因为你说“假设电脑没有妥协”。
如果您在机器上启动本地进程,并且机器没有受到危害,那么有什么可以保护的呢? 在这种情况下,没有什么东西会穿过网络,所以没有人可以窥探这些论点。
但是,如果您担心任何可能具有对计算机的管理访问权限的用户或可能看到数据的用户,那么您必须对其进行加密。 查看进程的命令行参数非常简单。 任何半个有能力的用户都可以找到他们。
我会加密整个字符串,而不是单个的部分,你基本上告诉了一个错误的用户嘿,这里的连接信息只是继续前进,打破它。 另一种选择是在另一个应用程序启动后传递参数。
当您的建筑物安全措施确定攻击是什么(获取数据库的连接信息)以及谁将发起攻击时,这一点非常重要。 你是否试图阻止本地用户得到这个? 你想阻止普通用户或专家用户吗?
例如,专家可以继续并转储过程的内存,并找到他未加密的字符串。
使用命名管道并在其上适当地设置ACL,然后让子进程继承该句柄 – 不必担心加密。
由于您必须修改接收应用程序来进行解密,为什么不修改接收应用程序以从配置文件读取,然后加密配置文件 。 如果你需要传递不同的值给另一个应用程序,为什么不传递一个connectionString键?