As impressões digitais contêm dois identificadores de assinante (client_id e server_id), tipo de ligação (CLIENT_MODE), bem como o tamanho do prólogo (através do qual a chave de sessão é negociada entre os assinantes durante o procedimento get_common_key) com um “sal” aleatório (diferente para cada cliente), protegido por um hash e encriptado usando RSA com a chave pública (apenas no nome) do servidor central. De notar que não publicamos esta chave em lado nenhum e não a transferimos para ninguém - por isso a produção das impressões digitais é feita por nós. Esta política de segurança da Extra Systems priva completamente qualquer atacante da capacidade de piratear o sistema Cypher Net nesta área.
Guardar o tamanho do prolog no ficheiro de impressão digital é necessário para garantir o funcionamento correto do procedimento connect_server no servidor central. O facto é que em diferentes distribuições o tamanho do hash pode diferir, o que levaria a uma alteração no tamanho do prólogo. O servidor central da Extra Systems Cypher Net não aprofunda todas estas subtilezas, mas apenas garante a transferência entre subscritores de um objeto, cujo tamanho recebe da impressão digital na variável prolog_size.
Os ficheiros de impressões digitais são criados por nós (no momento da entrega do produto ao cliente) através do seguinte 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); }
O conteúdo desta página está também disponível em inglês, francês, alemão, espanhol, ucraniano e russo.
© Extra Systems, 2024 |