Il convient de noter que le mécanisme d'empreinte digitale lui-même, que nous avons inventé dans ce système de cryptage Extra Systems Cypher Net, constitue l'un des mécanismes de protection du serveur central contre les attaques de pirates. Lorsqu'il reçoit une demande de connexion d'un client abstrait (qui peut être un attaquant), le serveur s'attend à recevoir immédiatement la bonne empreinte digitale de sa part. Si cela ne se produit pas, le serveur n'engage plus de conversation avec un tel client et met immédiatement fin à la connexion. Rappelons que les fichiers d'empreintes digitales étant cryptés via RSA avec la clé du serveur publique (en nom uniquement), qui n'est en réalité publiée nulle part, il est absolument impossible de les falsifier.
Ainsi, avec l'aide d'un mécanisme aussi simple, nous disposons ici aussi d'une protection qui ne peut pas être piratée.
La validité de l'empreinte reçue par le serveur est vérifiée par la procédure check_finger_print (qui est appelée sur le serveur dans la procédure 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; }
En plus de vérifier la validité du client qui a postulé, check_finger_print, comme le montre facilement ce code, effectue un certain nombre d'opérations préparatoires en appelant la procédure get_fingerprint_items. Avec son aide, à partir d'un objet d'empreinte digitale ayant la structure
typedef struct finger_print { unsigned char mixed_item[ITEM_SIZE * 2 * 3]; unsigned char mixed_hash[HARD_HASH_SIZE]; } FINGERPRINT;
dans un objet THREADDATA ayant la structure
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;
Les identifiants d'abonné (client_id et server_id), le type de connexion (client_mode) et la taille du prolog (prolog_size) sont extraits. Tous ces paramètres sont d'ailleurs absolument nécessaires à la procédure connect_server appelée sur le serveur central (dans la procédure dispatch_call) immédiatement après check_finger_print. En fait, tout le fonctionnement de connect_server (comme le montre facilement son code) est basé uniquement sur ces quatre paramètres.
Le contenu de cette page est également disponible en anglais, allemand, ukrainien et en russe.
© Extra Systems, 2024 |