Les empreintes numériques contiennent deux identifiants d'abonné (client_id et server_id), le type de connexion (CLIENT_MODE), ainsi que la taille du prologue (par lequel la clé de session est négociée entre les abonnés lors de la procédure get_common_key) avec un «sel» aléatoire (différent pour chaque client), protégé par un hachage et chiffré en RSA avec la clé publique (de nom uniquement) du serveur central. Il convient de souligner que nous ne publions cette clé nulle part et ne la transmettons à personne - c'est pourquoi nous effectuons la production des empreintes digitales. Cette politique de sécurité d'Extra Systems prive complètement tout attaquant de la possibilité de pirater le système Cypher Net dans cette zone.
La sauvegarde de la taille du prologue dans le fichier d'empreintes digitales est nécessaire pour garantir le bon fonctionnement de la procédure connect_server sur le serveur central. Le fait est que dans différentes distributions, la taille du hachage peut différer, ce qui entraînerait une modification de la taille du prologue. Le serveur central n'entre pas dans toutes ces subtilités, mais assure uniquement le transfert entre abonnés d'un objet dont il reçoit la taille grâce à l'empreinte digitale dans la variable prolog_size.
Les fichiers d'empreintes digitales sont créés par nos soins (au moment de la livraison du produit au client) selon l'algorithme suivant:
#define FINGERPRINT_CLIENT_MODE_BYTE 2 typedef struct finger_print { unsigned char mixed_item[ITEM_SIZE * 2 * 3]; unsigned char mixed_hash[HARD_HASH_SIZE]; } FINGERPRINT; void make_fingerprint(PEERID client_id, PEERID server_id) { unsigned char solt[ITEM_SIZE * 3]; unsigned char *client; unsigned char *server; unsigned char *prolog; int i,j,k, file_handle, prolog_size; unsigned char packed_value[PACKED_VALUE_LENTH], unpacked_value[VALUE_LENTH]; unsigned char crypted_value[VALUE_LENTH]; char str_buf[4096]; FINGERPRINT client_finger_print; file_handle = open("public_0", O_RDONLY); read(file_handle, str_buf, 4096); close(file_handle); str_to_value(strtok(str_buf, " "), encrypt_rsa_key.modulus); str_to_value(strtok(NULL, " "), encrypt_rsa_key.exponent); init_hard_hash(); prolog_size = PACKED_VALUE_LENTH + HASH_SIZE; client = (unsigned char *) &client_id; server = (unsigned char *) &server_id; prolog = (unsigned char *) &prolog_size; fill_random_buffer(solt, sizeof(solt)); for (i = j = k = 0; i < ITEM_SIZE; ) { client_finger_print.mixed_item[k++] = solt[i++]; client_finger_print.mixed_item[k++] = client[j++]; } for (j = 0; j < ITEM_SIZE; ) { client_finger_print.mixed_item[k++] = solt[i++]; client_finger_print.mixed_item[k++] = server[j++]; } for (j = 0; j < ITEM_SIZE; ) { client_finger_print.mixed_item[k++] = solt[i++]; client_finger_print.mixed_item[k++] = prolog[j++]; } client_finger_print.mixed_item[FINGERPRINT_CLIENT_MODE_BYTE] = CLIENT_MODE_INPUT; get_hard_hash(client_finger_print.mixed_item, sizeof(client_finger_print.mixed_item), client_finger_print.mixed_hash); memset(packed_value, 0, PACKED_VALUE_LENTH); memcpy(packed_value, &client_finger_print, sizeof(FINGERPRINT)); unpack_value(packed_value, unpacked_value); long_power_mod(unpacked_value, encrypt_rsa_key.exponent, encrypt_rsa_key.modulus, crypted_value); pack_value(crypted_value, packed_value); sprintf(str_buf, "fingerprints/fingerprint_i_%d_%d", client_id, server_id); file_handle = creat(str_buf, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); write(file_handle, packed_value, PACKED_VALUE_LENTH); close(file_handle); client_finger_print.mixed_item[FINGERPRINT_CLIENT_MODE_BYTE] = CLIENT_MODE_OUTPUT; get_hard_hash(client_finger_print.mixed_item, sizeof(client_finger_print.mixed_item), client_finger_print.mixed_hash); memset(packed_value, 0, PACKED_VALUE_LENTH); memcpy(packed_value, &client_finger_print, sizeof(FINGERPRINT)); unpack_value(packed_value, unpacked_value); long_power_mod(unpacked_value, encrypt_rsa_key.exponent, encrypt_rsa_key.modulus, crypted_value); pack_value(crypted_value, packed_value); sprintf(str_buf, "fingerprints/fingerprint_o_%d_%d", client_id, server_id); file_handle = creat(str_buf, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); write(file_handle, packed_value, PACKED_VALUE_LENTH); close(file_handle); }
Le contenu de cette page est également disponible en anglais, allemand, ukrainien et en russe.
© Extra Systems, 2024 |