Слід зазначити, що сам механізм fingerprint, винайдений нами в цій системі шифрозв'язку Extra Systems Cypher Net, є одним з механізмів захисту центрального сервера від атак хакерів. Отримуючи від абстрактного клієнта (який може бути зловмисником) запит на з'єднання, сервер очікує відразу отримати від нього правильний fingerprint. Якщо цього немає, сервер не веде з таким клієнтом ніяких подальших розмов, і негайно розриває з'єднання. Нагадаємо, що оскільки файли fingerprint зашифровані через RSA відкритим (тільки за назвою) ключем сервера, який насправді ніде не публікується, підробити їх неможливо.
Таким чином, за допомогою такого простого механізму ми і тут маємо захист, який неможливо зламати.
Перевірка валідності отриманого сервером відбитка fingerprint здійснюється процедурою check_finger_print (яка викликається на сервері у процедурі dispatch_call):
int check_finger_print(THREADDATA *thread_item) { unsigned char client_message[PACKED_VALUE_LENTH]; unsigned char encrypted_value[VALUE_LENTH], decrypted_value[VALUE_LENTH]; char local_hash[HARD_HASH_SIZE]; int my_socket; FINGERPRINT client_finger_print; my_socket = thread_item->thread_socket; if (socket_read_buffer(my_socket, client_message, PACKED_VALUE_LENTH) != PACKED_VALUE_LENTH) return 0; unpack_value(client_message, encrypted_value); long_power_mod(encrypted_value, decrypt_rsa_key.exponent, decrypt_rsa_key.modulus, decrypted_value); pack_value(decrypted_value, client_message); memcpy(&client_finger_print, client_message, sizeof(client_finger_print)); get_hard_hash(client_finger_print.mixed_item, sizeof(client_finger_print.mixed_item), local_hash); if (memcmp(client_finger_print.mixed_hash, local_hash, HARD_HASH_SIZE) != 0) return 0; get_fingerprint_items(&(thread_item->client_id), &(thread_item->server_id), &(thread_item->client_mode), &(thread_item->prolog_size), &client_finger_print); return 1; }
Крім перевірки валідності клієнта, check_finger_print, як легко бачити з даного коду, виконують ще ряд підготовчих операцій шляхом виклику процедури get_fingerprint_items. З її допомогою з об'єкта fingerprint, що має структуру
typedef struct finger_print { unsigned char mixed_item[ITEM_SIZE * 2 * 3]; unsigned char mixed_hash[HARD_HASH_SIZE]; } FINGERPRINT;
в об'єкт THREADDATA, що має структуру
typedef struct thread_data { int thread_id; int thread_socket; PEERID client_id; PEERID server_id; int server_thread; char *buffer_to_send; int buf_size; int prolog_size; unsigned char client_mode; } THREADDATA;
вилучаються ідентифікатори абонентів (client_id та server_id), тип з'єднання (client_mode) та розмір прологу (prolog_size). Всі ці параметри, до речі, абсолютно необхідні для викликаної на центральному сервері (у процедурі dispatch_call) відразу за check_finger_print процедурі connect_server. Фактично вся робота connect_server (як легко видно з її коду) заснована виключно на цих чотирьох параметрах
Контент цієї сторінки доступний також англійською, французькою, німецькою та російською мовами.
© Extra Systems, 2024 |