Как передать конфиденциальные данные между процессами в Windows?

StackOverflow https://stackoverflow.com/questions/983342

Вопрос

Я хотел бы перенести информацию об имени пользователя и пароле из одного процесса в другой процесс, работающий на том же сервере в Windows.Как лучше всего обеспечить эту передачу безопасным способом?Один из простых подходов — скопировать пароли в файл, затем заставить другой процесс прочитать их из файла, а затем удалить файл после его прочтения.Хотя это просто, меня беспокоит, безопасен ли он, поскольку кто-то все еще может получить доступ к этому файлу, даже если он живет только в течение короткого периода времени, а также есть вероятность того, что файл будет пропущен, если другой обрабатывает ошибки или выходит из строя.IPC, такие как сокеты и именованные каналы, кажутся излишними для решения этой проблемы.Я более склонен использовать файлы с отображением в памяти, как описано в этой ссылке ниже, где говорится о совместном использовании памяти между процессами.Это правильный подход?Кроме того, является ли хорошей идеей заполнять память фиктивными данными перед освобождением/стиранием, чтобы процессы Rouge не очищали данные из этой области памяти?

http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx

Это было полезно?

Решение

RPC здесь ваш друг (я бы не стал использовать именованные каналы для передачи защищенных данных, потому что у них есть некоторые серьезные проблемы (поскольку они работают в глобальном пространстве имен и, следовательно, уязвимы для атак с сквоттингом)).

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

Не забудьте надежно обнулить память, когда закончите ее использовать (в противном случае она может сохраниться на диске).

Если вы ДЕЙСТВИТЕЛЬНО хотите использовать шифрование, используйте CryptProtectMemory, который зашифрует данные способом, который можно использовать для IPC.

Другие советы

Используйте какой-нибудь IPC, который (1) не имеет резервной копии на диске, (2) поддерживает ACL.

Казалось бы, это указывает на именованные каналы.

Альтернативно, DCOM и WCF поддерживают шифрование контента.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top