Быстрая схема аутентификации и обмена ключами, устойчивая к DDoS-атаке

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование




В°нный в настройках, в случае появления запроса на подключение вызывается функция accept библиотеки winsock, тем самым создается подключение. Для каждого нового подключения создается отдельная нить в которую переадется только что созданный сокет для дольнейшей обработки соединения.

7.2.3 Реализация протокола аутентификации

Реализации протокола происходит в нутрии нити. От клиента принимается некий пакет данных, затем этот пакет разбивается функцией split_pakage на 4 поля P1 P2 P3 P4, Эти поля представляют собой массив символов unsigned char. После разбиения пакета начинается процедура предварительной аутентификации. Функция get_authkey принимает на вход поле P3 и массив authkey, она извлекает ключ предварительной аутентификации и в случае успеха возвращает 0. Если ключ был успешно получен то в функцию pre_auth перадетются поля P1 P4 и ключ, эта функция шифрует поле P1 алгоритмом AES и сравнивает его с P4 если они равны возвращает 0, что означает об успешном прохождении предварительной аутентификации. В случае если неудалось извлеч ключ или предварительная аутентификация была не пройдена приоритет нити понижается в противном случае приоритет остается неизменным. Следующим шагом является расшифровка поля P1 алгоритмом RSA на SKS для этого оно передается в функцию do_decrypt также туда передается массив ptext в который будет записан расшифрованный текст. После расшифровки это поле разбивается на два сессионных ключа и id публичного ключа клиента функцией split_P1. Теперь когда нам известе id извлекаем ключ из файла функцией get_PKC на вход она принимает id а возвращет структуру RSA, в которой хранится публичный ключь клиента, либо NULL. В том случае если PKC не был получен сервер отказывает клиенту в аутентификации, вызывает функцию make_replay которая формирует соответсвующий ответ, а затем отправляет этот ответ клиенту и разрывает соединение. Если же PKC был получен корректно вычисляется MD5 хеш от поля P1, функцией do_DECRYPT_AES на первом ключе сессии расшифровывается поле P2, после чего хеш и расшифрованные данные передаются в функцию do_verify которая проверяет правильность подписи и в случае успеха возвращает 0. Если подпись оказалась подлинной то аутентификация iитается успешной об этом функцией make_replay создается соответствующее сообщение, которое шифруется алгоритмом AES на втором ключе сессии, данное сообщение передается клиенту и функцией gen_authkey генерируются новый IDauthkey и authkey. После этого если небыл установлен флаг диалога соединение разрывается. Если же подпись оказалась фальшивой то опять же функцией make_replay формируется сообщение об этом и отправлется клиенту, после чего соединение разрывается.

7.2.4 Измерение времени работы протокола

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

unsigned __int64 rdtsc() {

_asm{

rdtsc

}

}

Данная функция возвращает значение iетчика циклов процессора. Как было описано выше, на стадии инициализации сервер вычисляет среднее изменения этого iетчика за секунду, это позволяет нам переводить полученное значение в миллисекунды по формуле

(t2-t1)/avgt*1000

где t2- значение iетчика в конце протокола t1 - в начале а avgt- среднее значение за секунду.

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

7.2.5 Общение с клиентом

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

7.2.6 Логирование

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

Система логирования разделена на две части. Первая часть отвечает за запись различных исключительных ситуаций, которые могут возникнуть в процессе работы сервера. Информация о них записывается в файл log_error.txt, запись содержит короткое пояснение и код ошибки. Пример такой записи WSAStart error 10048 данная запись говорит о том, что не удалось открыть заданный порт так как он уже используется, код ошибки сформирован функцией WSAGetLastError() библиотеки winsock полный список можно найти на официальном сайте[16].

Вторая часть отвечает за за