Анализ кода класса ChannelManager (пример CNG)
В примере защищенного обмена данными с шифрованием CNG класс ChannelManager обеспечивает инфраструктуру межпроцессного взаимодействия.
Этот класс отвечает за выполнение следующих операций.
Создание, открытие, закрытие и удаление именованных каналов.
Отправка и получение флагов управления приложений, имен каналов, цифровых подписей, ключей шифрования и сообщений.
Общие сведения о примере и описание упомянутых в этом разделе версий см. в разделе Пример защищенного обмена данными с шифрованием CNG.
Содержание файла ChannelManager.cs
В файле ChannelManager.cs содержатся следующие классы и методы.
Класс ChannelManager.
Конструктор. Создает именованный канал, после чего дожидается подключения на другом конце канала.Если именованный канал является сервером, он дожидается подключения клиента в результате вызова метода WaitForConnection.Если именованный канал является клиентом, он дожидается подключения сервера в результате вызова метода Connect.Конструктор ChannelManager не завершает работу, пока не будет установлено подключение.
Метод Dispose. Реализует интерфейс System.IDisposable, высвобождая выделенные ресурсы (Stream m_Stream) по выходе класса из области действия.
Метод ReadMessage. Получает сообщения от клиентов канала.
Метод SendMessage. Отправляет сообщения клиентам канала.
Метод AppControl. Используется Алисой для отправки флагов управления приложения Бобу и Мэллори.Эти флаги синхронизируют состояния Version, fMallory и fVerbose трех командных окон.Метод AppControl не участвует в шифровании или передаче сообщений.Он служит только для управления взаимодействием приложений.Этот метод создает временный объект ChannelManager, который удаляется после использования.
Метод SendChannelName. Вспомогательный метод, которые отвечает за отправку имени нового канала клиенту.Этот метод создает временный объект ChannelManager, который удаляется после использования.
Метод ReceiveChannelName. Вспомогательный метод, которые отвечает за получение имени нового канала с сервера.Этот метод создает временный объект ChannelManager, который удаляется после использования.
Описание класса ChannelManager
Приложения Алисы, Боба и Мэллори соединены именованными каналами, которые созданы экземплярами ChannelManager.Каждое приложение создает и удаляет объекты ChannelManager двух типов.
Долгосрочные объекты. Алиса и Боб создают долгосрочный объект ChannelManager при запуске своих методов Run.Эти объекты служат для передачи контактных данных клиентов.Мэллори при запуске метода Run создает два долгосрочных объекта ChannelManager: первый для взаимодействия с Алисой, а второй для взаимодействия с Бобом.Каналы служат для обмена ключами шифрования и зашифрованными сообщениями.Они существуют до завершения метода Run, после чего удаляются.
Временные объекты. Методы AppControl, SendChannelName и ReceiveChannelName создают временные объекты ChannelManager для выполнения тех или иных задач.После этого объекты удаляются.Кроме того, в версиях 4 и 5 Алиса с помощью временного объекта ChannelManager отправляет Бобу закрытый ключ цифровой подписи.
Класс ChannelManager реализует интерфейс System.IDisposable и управляет режимами передачи send и receive.
Класс позволяет создать иллюзию динамического обмена данными между Алисой, Бобом и Мэллори.На практике в каждый конкретный момент времени класс может находиться только в одном режиме — он может быть либо сервером, либо клиентом.Поэтому приложения Алисы, Боба и Мэллори выполняются в правильно установленной последовательности.В процессе выполнения примера каждое приложение ожидает открытия и закрытия каналов в определенные моменты времени.Передача данных происходит не асинхронно, как это может показаться.
Может показаться, что диспетчер потоков управляет потоками в фоновом режиме; но на самом деле вызовы потоков не используются.Синхронизации межпроцессного взаимодействия можно достичь только применением правильной последовательности вызовов send и receive между Алисой, Бобом и Мэллори.В результате будет создаваться впечатление, что три окна легко взаимодействуют в соответствии со сценарием, описанным в разделе Общие сведения о примере CNG.
Одно из преимуществ такой реализации заключается в обеспечении синхронизации, хотя при этом и используется простой для понимания последовательный код.Ее недостаток — ненадежность: если клиенту канала не удастся подключиться к серверу, то сервер перестанет отвечать.Поэтому лучше использовать многопоточный сервер канала, который корректно обрабатывает такие сбои.Однако для простоты в данном примере такой подход не используется.
Объект ChannelManager создается в методах Main Алисы, Боба и Мэллори, а конструктор класса Communicator содержится в файле Communicator.cs.
Особенности использования
Класс ChannelManager используется в пяти различных случаях: управление приложениями, передача имен каналов, передача сообщений, передача ключей цифровой подписи и передача открытых ключей шифрования.Ниже эти ситуации описаны в том порядке, в котором они указаны в исходном коде.
Управление приложениями. Алиса вызывает метод InitializeOptions в начале метода Main и получает у пользователя параметры сеанса.Эти параметры (Version, fMallory и fVerbose) впоследствии пересылаются Бобу и Мэллори методом AppControl.Если пользователь принимает решение закрыть приложение вводом буквы "x", вместо параметров сеанса метод AppControl отправляет Бобу и Мэллори строку "exit".
Метод AppControl Алисы создает два временных сервера каналов ChannelManager: BobControlChannel и MalloryControlChannel.
Методы AppControl Боба и Мэллори создают временные клиенты каналов ChannelManager и подключаются к соответствующим каналам управления.
Боб и Мэллори получают от Алисы параметры сеанса и сразу же удаляют временные объекты ChannelManager.
Передача имен каналов. После передачи параметров сеанса Алиса отправляет Бобу имя нового канала.
Алиса использует метод SendChannelName, а Боб и Мэллори — методы ReceiveChannelName.Каждый из методов создает временный сервер или клиент канала ChannelManager.После отправки или получения имени нового канала временный экземпляр ChannelManager удаляется.
Уязвимость в системе безопасности возникает, когда Мэллори перехватывает имя нового канала в результате вызова метода ReceiveChannelName за 200 миллисекунд до того, как это сделает Боб.Описание этой уязвимости см. в разделе Реализация атаки "злоумышленник в середине" (пример CNG).
Передача сообщений. После передачи параметров сеанса и имени канала Алиса, Боб и Мэллори создают объекты Communicator.Конструктор Communicator получает имя нового канала, отправленное на предыдущем шаге, и использует его для создания долгосрочных экземпляров ChannelManager.Это единственные невременные объекты ChannelManager.Они существуют, пока не будет передано и получено сообщение, после чего удаляются.
Примечание
Объект ChannelManager, созданный Алисой, инкапсулирует сервер канала с именем AliceAndBobChannel.Однако Мэллори перехватывает это имя и отправляет Бобу другое имя канала (AliceAndBobChannel1).Боб передает эту строку конструктору Communicator как параметр name и создает клиент канала с именем AliceAndBobChannel1.Такая замена имени позволяет Мэллори отправлять Бобу сообщения от имени Алисы.
Передача ключей цифровой подписи. Когда Алиса создает свой объект Communicator, проверяется флаг Version.В версии 3 она отправляет Бобу ключ цифровой подписи по именованному каналу PublicChannel, где он перехватывается Мэллори.В версиях 4 и 5 она создает временный секретный экземпляр ChannelManager.Этот экземпляр будет впоследствии использоваться для передачи Бобу закрытого ключа цифровой подписи.
Примечание
Мэллори не знает об этом закрытом именованном канале, поскольку у него нет версии 4 или 5 программного обеспечения для обмена мгновенными сообщениями.Алиса продолжает использовать долгосрочный объект ChannelManager, созданный на шаге 3, чтобы отправлять Бобу поддельные цифровые подписи.В версиях 4 и 5 средство обмена мгновенными сообщениям Боба обновлено и игнорирует этот объект.Однако Мэллори думает, что подпись действительна, и использует ее, чтобы подписывать свои ключи шифрования и сообщения.Это его и выдает.
Передача открытых ключей шифрования. Флаг Version проверяется еще раз.В версии 2 и больше долгосрочный объект ChannelManager для обмена сообщениями, созданный на шаге 3, используется для отправки и получения открытых ключей шифрования.
После обмена именами каналов, цифровыми подписями и ключами шифрования Алиса и Боб используют созданный на шаге 3 объект ChannelManager для передачи сообщений.
См. также
Ссылки
Основные понятия
Пример защищенного обмена данными с шифрованием CNG