Поделиться через


Анализ кода класса 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 используется в пяти различных случаях: управление приложениями, передача имен каналов, передача сообщений, передача ключей цифровой подписи и передача открытых ключей шифрования.Ниже эти ситуации описаны в том порядке, в котором они указаны в исходном коде.

  1. Управление приложениями. Алиса вызывает метод InitializeOptions в начале метода Main и получает у пользователя параметры сеанса.Эти параметры (Version, fMallory и fVerbose) впоследствии пересылаются Бобу и Мэллори методом AppControl.Если пользователь принимает решение закрыть приложение вводом буквы "x", вместо параметров сеанса метод AppControl отправляет Бобу и Мэллори строку "exit".

    • Метод AppControl Алисы создает два временных сервера каналов ChannelManager: BobControlChannel и MalloryControlChannel.

    • Методы AppControl Боба и Мэллори создают временные клиенты каналов ChannelManager и подключаются к соответствующим каналам управления.

    • Боб и Мэллори получают от Алисы параметры сеанса и сразу же удаляют временные объекты ChannelManager.

  2. Передача имен каналов. После передачи параметров сеанса Алиса отправляет Бобу имя нового канала.

    • Алиса использует метод SendChannelName, а Боб и Мэллори — методы ReceiveChannelName.Каждый из методов создает временный сервер или клиент канала ChannelManager.После отправки или получения имени нового канала временный экземпляр ChannelManager удаляется.

    • Уязвимость в системе безопасности возникает, когда Мэллори перехватывает имя нового канала в результате вызова метода ReceiveChannelName за 200 миллисекунд до того, как это сделает Боб.Описание этой уязвимости см. в разделе Реализация атаки "злоумышленник в середине" (пример CNG).

  3. Передача сообщений. После передачи параметров сеанса и имени канала Алиса, Боб и Мэллори создают объекты Communicator.Конструктор Communicator получает имя нового канала, отправленное на предыдущем шаге, и использует его для создания долгосрочных экземпляров ChannelManager.Это единственные невременные объекты ChannelManager.Они существуют, пока не будет передано и получено сообщение, после чего удаляются.

    Примечание

    Объект ChannelManager, созданный Алисой, инкапсулирует сервер канала с именем AliceAndBobChannel.Однако Мэллори перехватывает это имя и отправляет Бобу другое имя канала (AliceAndBobChannel1).Боб передает эту строку конструктору Communicator как параметр name и создает клиент канала с именем AliceAndBobChannel1.Такая замена имени позволяет Мэллори отправлять Бобу сообщения от имени Алисы.

  4. Передача ключей цифровой подписи. Когда Алиса создает свой объект Communicator, проверяется флаг Version.В версии 3 она отправляет Бобу ключ цифровой подписи по именованному каналу PublicChannel, где он перехватывается Мэллори.В версиях 4 и 5 она создает временный секретный экземпляр ChannelManager.Этот экземпляр будет впоследствии использоваться для передачи Бобу закрытого ключа цифровой подписи.

    Примечание

    Мэллори не знает об этом закрытом именованном канале, поскольку у него нет версии 4 или 5 программного обеспечения для обмена мгновенными сообщениями.Алиса продолжает использовать долгосрочный объект ChannelManager, созданный на шаге 3, чтобы отправлять Бобу поддельные цифровые подписи.В версиях 4 и 5 средство обмена мгновенными сообщениям Боба обновлено и игнорирует этот объект.Однако Мэллори думает, что подпись действительна, и использует ее, чтобы подписывать свои ключи шифрования и сообщения.Это его и выдает.

  5. Передача открытых ключей шифрования. Флаг Version проверяется еще раз.В версии 2 и больше долгосрочный объект ChannelManager для обмена сообщениями, созданный на шаге 3, используется для отправки и получения открытых ключей шифрования.

После обмена именами каналов, цифровыми подписями и ключами шифрования Алиса и Боб используют созданный на шаге 3 объект ChannelManager для передачи сообщений.

См. также

Ссылки

NamedPipeServerStream

NamedPipeClientStream

Основные понятия

Пример защищенного обмена данными с шифрованием CNG

Исходный код файла ChannelManager.cs (пример CNG)

Общие сведения об исходном коде (пример CNG)