Las huellas digitales contienen dos identificadores de suscriptor (client_id y server_id), tipo de conexión (CLIENT_MODE), así como el tamaño del prólogo (a través del cual se negocia la clave de sesión entre suscriptores durante el procedimiento get_common_key) con una "sal" aleatoria (diferente para cada cliente), protegido por un hash y cifrado mediante RSA con la clave pública (solo de nombre) del servidor central. Cabe destacar que no publicamos esta clave en ninguna parte ni la transferimos a nadie; es por eso que la producción de huellas dactilares la llevamos a cabo nosotros. Esta política de seguridad de Extra Systems priva por completo a cualquier atacante de la capacidad de piratear el sistema Cypher Net en esta área.
Es necesario guardar el tamaño del prólogo en el archivo de huellas digitales para garantizar el funcionamiento correcto del procedimiento connect_server en el servidor central. El hecho es que en diferentes distribuciones el tamaño del hash puede diferir, lo que conduciría a un cambio en el tamaño del prólogo. El servidor central de Extra Systems Cypher Net no profundiza en todas estas sutilezas, sino que solo asegura la transferencia entre suscriptores de un objeto, cuyo tamaño recibe de la huella digital en la variable prolog_size.
Los archivos de huellas dactilares los creamos nosotros (en el momento de la entrega del producto al cliente) utilizando el siguiente algoritmo:
#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); }
El contenido de esta página también está disponible en inglés, francés, alemán, portugués, ucraniano y ruso.
© Extra Systems, 2024 |