Es ist zu beachten, dass der Fingerabdruckmechanismus selbst, den wir in diesem Extra Systems Cypher Net-Verschlüsselungssystem erfunden haben, als einer der Mechanismen zum Schutz des zentralen Servers vor Hackerangriffen dient. Beim Empfang einer Verbindungsanfrage von einem abstrakten Client (bei dem es sich möglicherweise um einen Angreifer handelt) erwartet der Server, sofort den richtigen Fingerabdruck von diesem zu erhalten. Geschieht dies nicht, führt der Server keine weiteren Gespräche mit einem solchen Client und beendet die Verbindung sofort. Wir möchten Sie daran erinnern, dass es absolut unmöglich ist, Fingerabdruckdateien zu fälschen, da sie über RSA mit dem öffentlichen (nur dem Namen nach) Serverschlüssel verschlüsselt werden, der eigentlich nirgendwo veröffentlicht wird.
Mit Hilfe eines so einfachen Mechanismus verfügen wir also auch hier über einen Schutz, der nicht gehackt werden kann.
Die Gültigkeit des vom Server empfangenen Fingerabdrucks wird durch die Prozedur check_finger_print (die auf dem Server in der Prozedur „dispatch_call“ aufgerufen wird) überprüft:
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; }
Zusätzlich zur Überprüfung der Gültigkeit des Clients, der sich beworben hat, führt check_finger_print, wie aus diesem Code leicht ersichtlich ist, eine Reihe vorbereitender Vorgänge durch, indem es die Prozedur get_fingerprint_items aufruft. Mit seiner Hilfe wird aus einem Fingerabdruck ein Objekt mit der Struktur
typedef struct finger_print { unsigned char mixed_item[ITEM_SIZE * 2 * 3]; unsigned char mixed_hash[HARD_HASH_SIZE]; } FINGERPRINT;
in ein THREADDATA-Objekt mit der Struktur
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;
Abonnenten-IDs (client_id und server_id), Verbindungstyp (client_mode) und Prologgröße (prolog_size) werden extrahiert. Alle diese Parameter sind übrigens unbedingt notwendig für die connect_server-Prozedur, die unmittelbar nach check_finger_print auf dem zentralen Server (in der dispatch_call Prozedur) aufgerufen wird. Tatsächlich basiert der gesamte Betrieb von connect_server (wie aus seinem Code leicht ersichtlich ist) ausschließlich auf diesen vier Parametern.
Der Inhalt dieser Seite ist auch in Englisch, Französisch, Ukrainisch und Russisch verfügbar.
© Extra Systems, 2024 |