Должен ли я передавать конфиденциальные данные в вызов Process.Start в .NET? - PullRequest
4 голосов
/ 16 июня 2009

Я работаю над приложением .NET Windows, которое будет использовать Process.Start для запуска другого разработанного внутри себя приложения .NET, работающего на том же ПК. Мне нужно передать информацию о соединении с базой данных, включая идентификатор пользователя и пароль, целевому приложению. Я пытаюсь определить, нужно ли мне шифровать информацию перед отправкой.

Если компьютер конечного пользователя не скомпрометирован, будет ли где-либо раскрыта информация о соединении, если я передам ее в незашифрованном виде в аргументах?

Будет ли что-то вроде этого в порядке ...

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);

Ответы [ 5 ]

4 голосов
/ 16 июня 2009

Извлечь аргументы, с которыми был вызван процесс, довольно легко, поэтому они будут доступны локально технически настроенному пользователю. Если это не проблема для вас, я не буду об этом беспокоиться, поскольку вы говорите, что не осуществляете передачу по сети, и ваш вопрос требует от нас предположить, что аппарат не скомпрометирован.

2 голосов
/ 16 июня 2009

Из вашего вопроса не ясно, от кого вы пытаетесь защитить данные. Это сбивает с толку, потому что вы сказали «предположим, что компьютер не взломан».

Если вы запускаете локальный процесс на машине, и машина не взломана, то от чего защищать? Ничто не будет пересекать сеть в этом сценарии, поэтому никто не может шпионить за аргументами.

Однако, если вы беспокоитесь о том, кто может иметь административный доступ к компьютеру, или о том, что пользователь потенциально видит эти данные, тогда да, вы должны зашифровать их. Довольно просто увидеть аргументы командной строки процесса. Их может найти любой полукомпетентный пользователь.

1 голос
/ 17 июня 2009

Используйте именованный канал и соответствующим образом установите ACL для него, затем дочерний процесс наследует дескриптор - не беспокойтесь о шифровании.

1 голос
/ 16 июня 2009

Я бы зашифровал всю строку, а не отдельные части, вы, по сути, сказали недобросовестному пользователю, эй, вот информация о соединении, просто идите и сломайте ее. Другой вариант - передать аргументы после запуска другого приложения.

Важно, когда ваши меры безопасности здания определяют, что представляет собой атака (получение доступа к информации о соединении для базы данных) и кто будет проводить атаку. Вы пытаетесь помешать локальному пользователю получить это? Вы пытаетесь помешать обычному пользователю или опытному пользователю?

Например, эксперт может пойти дальше и сбросить память процесса и найти незашифрованную строку.

0 голосов
/ 16 июня 2009

Поскольку вам нужно изменить принимающее приложение для расшифровки, почему бы не изменить принимающее приложение для чтения из файла конфигурации, а затем зашифровать файл конфигурации . Если вам нужно передать другие значения другому приложению, почему бы не передать ключ connectionString?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...