Утверждения. Алгоритм У.Диффи и М.Хеллмана

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

Утверждение Наилучшее с точки зрения безопасности взаимодействие объектов в распределенной ВС возможно только по физически выделенному каналу.

Утверждение При построении защищенной системы связи в распределенной ВС необходимо исходить из того, что все сообщения, передаваемые по каналу связи, могут быть перехвачены, но это не должно повлечь за собой нарушения безопасности системы в целом. Утверждение Любое взаимодействие двух объектов в распределенной ВС должно проходить по виртуальному каналу связи.

В 1976 г. У. Диффи и М. Хеллман предложили следующий метод открытого распределения ключей. Пусть два объекта A и B условились о выборе в качестве общей начальной информации большого простого числа p и примитивного корня степени p - 1 из 1 в поле вычетов по модулю p. Тогда эти пользователи действуют в соответствии с протоколом: A вырабатывает случайное число x, вычисляет число a x (mod p) и посылает его B ; B вырабатывает случайное число y, вычисляет число ay (mod p) и посылает его A ; затем A и B возводят полученное число в степень со своим показателем и получают число a xy (mod p).

Алгоритм У. Диффи и М. Хеллмана открытого распределения ключей

Это число и является сеансовым ключом для одноключевого алгоритма DES. Для раскрытия этого ключа криптоаналитику необходимо по известным a x (mod p), a y (mod p) найти a xy (mod p) , т.е. найти x или y. Нахождение числа x по его экспоненте a x (mod p) называется задачей дискретного логарифмирования в простом поле. Эта задача является труднорешаемой. Особенность данного криптоалгоритма состоит в том, что перехват по каналу связи пересылаемых в процессе создания виртуального канала сообщений a x (mod p) и a y (mod p) не позволит атакующему получить конечный ключ шифрования a xy (mod p). Этот ключ далее должен использоваться, во-первых, для цифровой подписи сообщений и, во-вторых, для их криптозащиты. Шифрование сообщений необходимо для соблюдения Утверждения 2. В заключении к данному пункту сформулируем следующее требование к созданию защищенных систем связи в распределенных ВС и два следствия из него:

Утверждение Для обеспечения надежной идентификации объектов распределенной ВС при создании виртуального канала необходимо использовать криптоалгоритмы с открытым ключом.

Следствие Необходимо обеспечить цифровую подпись сообщений.

Следствие Необходимо обеспечить возможность шифрования сообщений.

Утверждение В распределенной ВС необходимо обеспечить на сетевом уровне контроль за маршрутом сообщений для аутентификации адреса отправителя.

Утверждение Для обеспечения доступности ресурсов распределенной ВС необходим контроль за виртуальными соединениями между ее объектами.

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

Следствие Необходимо обеспечить контроль за использованием соединения, разрывая его по тайм-ауту в случае отсутствия сообщений.

Утверждение Наиболее безопасной распределенной ВС является та система, в которой информация о ее объектах изначально полностью определена и в которой не используются алгоритмы удаленного поиска.

Утверждение В том случае, если выполненить требование 7 невозможно, необходимо в распределенной ВС использовать только алгоритм удаленного поиска с выделенным информационно-поисковым сервером, и при этом взаимодействие объектов системы с данным сервером должно осуществляться только по виртуальному каналу с применением надежных алгоритмов защиты соединения с обязательным использованием статической ключевой информации.

Следствие В распределенной ВС для обеспечения безопасности необходимо отказаться от алгоритмов удаленного поиска с использованием широковещательных запросов.

 

28.В локальных и глобальных сетях существует два принципиально разных способа передачи данных. Первый из них предполагает посылку пакетов данных от одного узла другому (или сразу нескольким узлам) без получения подтверждения о доставке и даже без гарантии того, что передаваемые пакеты будут получены в правильной последовательности. Примером такого протокола может служить протокол UDP (User Datagram Protocol ), который используется в сетях TCP/IP, или протокол IPX , который является базовым в сетях Novell NetWare . Основные преимущества датаграмных протоколов заключаются в высоком быстродействии и возможности широковещательной передачи данных, когда один узел отправляет сообщения, а другие их получают, причем все одновременно. Второй способ передачи данных предполагает создание канала передачи данных между двумя различными узлами сети.. Примерами протоколов, использующих каналы связи, могут служить протоколы TCP и SPX Для передачи данных с использованием любого из перечисленных выше способов каждое приложение должно создать объект, который называется сокетом. По своему назначению сокет больше всего похож на идентификатор файла, который нужен для выполнения над файлом операций чтения или записи. Прежде чем приложение, запущенное на узле сети сможет выполнять передачу или прием данных, оно должно создать сокет и проинициализировать его, указав некоторые параметры: IP адрес, связанный с сокетом, номер порта, для которого будут выполняться операции передачи данных, а также тип сокета. Первый тип предназначен для передачи данных в виде датаграмм, второй - с использованием каналов связи. Инициализация приложения и завершение его работы

В процессе инициализации приложение должно зарегистрировать себя в библиотеке WSOCK32.DLL, которая предоставляет приложениям интерфейс Windows Sockets в среде операционных систем Microsoft Windows 95 и Microsoft Windows NT. Для инициализации необходимо вызвать функцию WSAStartup , определенную следующим образом.В параметре wVersionRequested вы должны указать версию интерфейса Windows Sockets, необходимую для работы вашего приложения. В случае успеха функция WSAStartup возвращает нулевое значение. Если происходит ошибка, возвращается одно из следующих значений: WSASYSNOTREADY(Сетевое программное обеспечение не готово для работы) Приложение может одновременно создавать несколько сокетов, например, для использования в разных подзадачах одного процесса. В поле iMaxSockets хранится максимальное количество сокетов, которое можно получить для одного процесса. Перед тем, как завершить свою работу, приложение должно освободить ресурсы, полученные у операционной системы для работы с Windows Sockets. Для выполнения этой задачи приложение должно вызвать функцию WSACleanup , определенную так, как это показано ниже. Эта функция может возвратить нулевое значение при успехе или значение SOCKET_ERROR в случае ошибки. Для получения кода ошибки вы должны воспользоваться функцией с именем WSAGetLastError .

Функция WSAGetLastError позволяет определить код ошибки при неудачном завершении практически всех функций интерфейса Windows Sockets. Вы должны вызывать ее сразу вслед за функцией, завершившейся неудачно. Создание и инициализация сокета:

После инициализации интерфейса Windows Sockets ваше приложение должно создать один или несколько сокетов, которые будут использованы для передачи данных.

Создание сокета. Сокет создается с помощью функции socket.Параметр af определяет формат адреса. Для этого параметра вы должны указывать значение AF_INET , что соответствует формату адреса, принятому в Internet. Параметры type и protocol определяют, сооветственно, тип сокета и протокол, который будет использован для данного сокета. В случае успеха функция socket возвращает дескриптор, который нужно использовать для выполнения всех операций над данным сокетом. Если же произошла ошибка, эта функция возвращает значение INVALID_SOCKET . Для анализа причины ошибки вы должны вызвать функцию WSAGetLastError

 

Удаление сокета

Для освобождения ресурсов приложение должно закрывать сокеты, к/ые ему больше не нужны, вызывая функцию closesocket : int closesocket (SOCKET sock);Перед использованием надо задать параметры сокета. Для этого вы должны подготовить структуру типа sockaddr. Для работы с адресами в формате Internet используется другой вариант структуры, в котором детализируется формат поля sa_data.Особенностью поля sin_port является использование так называемого сетевого формата данных. Этот формат отличается от того, что принят в процессорах с архитектурой Intel, а именно, младшие байты данных хранятся по старшим адресам памяти.Универсальный сетевой формат данных удобен при организации глобальных сетей, так как в узлах такой сети могут использоваться компьютеры с различной архитектурой.

Для выполнения преобразований из обычного формата в сетевой и обратно в интерфейсе Windows Sockets предусмотрен специальный набор функций. В частности, для заполнения поля sin_port нужно использовать функцию htons, выполняющую преобразование 16-разрядных данных из формата Intel в сетевой формат. При инициализации сокета надо указать адрес IP, с которым будет работать данный сокет.

Если известен адрес в виде четырех десятичных чисел, разделенных точкой (именно так его вводит пользователь), то можно заполнить поле адреса при помощи функции inet_addr .В случае ошибки функция возвращает значение INADDR_NONE , что можно использовать для проверки. Обратное преобразование адреса IP в текстовую строку можно при необходимости легко выполнить с помощью функции inet_ntoa .При ошибке эта функция возвращает значение NULL.

Однако чаще всего пользователь работает с доменными именами, используя сервер DNS или файл HOSTS . В этом случае вначале вы должны воспользоваться функцией gethostbyname , возвращающей адрес IP, а затем записать полученный адрес в структуру sin_addr . В случае ошибки функция gethostbyname возвращает NULL. При этом причину ошибки можно выяснить, проверив код возврата функции WSAGetLastError .

Если же указанный узел найден в базе DNS или в файле HOSTS , функция gethostbyname возвращает указатель на структуру hosten.

 

Привязка адреса к сокету

После того как подготовили структуру SOCKADDR , записав в нее параметры сокета (в частности, адрес), следует выполнить привязку адреса к сокету при помощи функции bind .

Параметр sock должен содержать дескриптор сокета, созданного функцией socket .

В поле addr следует записать указатель на подготовленную структуру SOCKADDR , а в поле namelen - размер этой структуры.

В случае ошибки функция bind возвращает значение SOCKET_ERROR . Дальнейший анализ причин ошибки следует выполнять при помощи функции WSAGetLastError .

 

Создание канала связи

Если вы собираетесь передавать сообщения при помощи протокола UDP , канал связи не нужен. Сразу после создания сокетов и их инициализации можно приступать к передаче данных. Но для передачи данных с использованием протокола TCP необходимо создать канал связи.

Сторона сервера

Рассмотрим процедуру создания канала связи со стороны сервера. Прежде всего вы должны переключить сокет в режим приема для выполнения ожидания соединения с клиентом при помощи функции listen. Через параметр sock функции необходимо передать дескриптор сокета, который будет использован для создания канала. Параметр backlog задает максимальный размер очереди для ожидания соединения. Очередь содержит запросы на установку соединений для каждой пары значений. Далее необходимо выполнить ожидание соединения. Это можно выполнить двумя способами.

1способзаключается в циклическом вызове функции accept до тех пор, пока не будет установлено соединение. Затем можно будет приступать к обмену данными. Через параметр sock необходимо указать дескриптор сокета, который находится в режиме приема для выполнения ожидания. Параметр addr должен содержать адрес буфера, в который будет записан адрес узла, подключившегося к серверу. Размер этого буфера необходимо указать в переменной типа int, адрес которой передается через параметр addrlen.

2способоснованный на использовании расширения программного интерфейса Windows Socke. Вместо того чтобы ожидать соединение приложение может вызвать один раз функцию WSAAsyncSelect . Обработчик сообщения вначале вызывает функцию accept , выполняющую создание канала передачи данных. После этого функция WSAAsyncSelect вызывается еще один раз для того чтобы установить асинхронную обработку приема данных от удаленного клиента, а также обработку ситуации разрыва канала связи.

Сторона клиента

Рассмотрим процедуру установки канала связи со стороны клиента, использованную нами в приложении CLIENT. Для установки соединения в приложении используется функция SetConnection. Вначале с помощью функции socket эта функция создает сокет. Затем выполняется заполнение адресной информацией структуры dest_sin.

Надо отметить, что для получения адреса IP мы воспользовались функцией gethostbyname , указав ей имя узла localhost . После заполнения структуры с адресной информацией функция connect создает канал связи с сервером.

 

Передача и прием данных

После того как канал создан, можно начинать передачу данных. Для передачи данных при помощи протокола TCP вы можете воспользоваться функциями send и recv , которые входят в программный интерфейс Windows Sockets. Функция передачи данных send имеет три параметра - дескриптор сокета sock, на котором выполняется передача, адрес буфера buf, содержащего передаваемое сообщение, размер этого буфера bufsize и флаги flags. Параметры функции recv , предназначенной для приема данных, аналогичны параметрам функции send . Заметим, что функции recv и send возвращают количество, соответственно, принятых и переданных байт данных. Приложение, которое принимает данные, должно вызывать функцию recv в цикле до тех пор, пока не будут приняты все переданные данные. При этом на один вызов функции send может приходиться несколько вызовов функции recv. В случае ошибки обе эти функции возвращают значение SOCKET_ERROR . Для анализа причин возникновения ошибки следует воспользоваться функцией WSAGetLastError . После установки канала связи оно вызывает функцию WSAAsyncSelect. Когда функция WSAAsyncSelect выполнилась успешно, она возвращает нулевое значение, при ошибке - значение SOCKET_ERROR.