.Net 3.5, самый безопасный способ передачи строк между процессами. - PullRequest
4 голосов
/ 05 сентября 2008

Я хотел бы иметь возможность передавать SecureString (кэшированную фразу-пароль) дочернему процессу в C # (.Net 3.5), но я не знаю, какой самый безопасный способ сделать это. Если бы мне пришлось преобразовать SecureString обратно в обычную строку и передать ее, например, в качестве аргумента командной строки, то я думаю значение может быть подвержено разбиению на страницы диска - что сделало бы текст открытым файловую систему и разрушить смысл использования SecureString.

Может ли вместо этого передаваться IntPtr для SecureString? Могу ли я использовать именованную трубу без увеличения риска?

Ответы [ 2 ]

3 голосов
/ 06 сентября 2008

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

В целом безопасность на стороне клиента очень сложна, и, если у вас нет выделенного оборудования (например, чипа TPM), почти невозможно получить права. Два решения будут:

  • Если вам нужно только проверить на равенство между двумя строками (т. Е. Совпадает ли эта строка с той, что была у меня ранее), сохраните только ее (соленое) хеш-значение.
  • Заставить пользователя повторно вводить информацию, когда она понадобится во второй раз (не очень удобно, но безопасность и удобство противоположны друг другу)
0 голосов
/ 05 сентября 2008

Если ваш дочерний процесс также не понимает, как работать с SecureString, я не думаю, что есть способ передать его напрямую. Например, метод Process.Start () имеет две перегрузки, которые принимают SecureString, поэтому риск фактического прослушивания строкового значения сводится к минимуму (это все еще возможно, поскольку где-то на пути получения или отмены фактического значения).

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

...