É de notar que o próprio motor de impressão digital, que inventámos neste sistema de encriptação Cypher Net da Extra Systems, serve como um dos mecanismos de proteção do servidor central contra ataques de hackers. Ao receber um pedido de ligação de um cliente abstrato (que pode ser um atacante), o servidor espera receber imediatamente a impressão digital correta do mesmo. Se tal não acontecer, o servidor deixa de conduzir conversas com esse cliente e termina imediatamente a ligação. Deixe-nos lembrar-lhe que, como os ficheiros de impressões digitais são encriptados via RSA com a chave pública do servidor (apenas no nome), que na verdade não é publicada em lado nenhum, é absolutamente impossível falsificá-los.
Assim, com a ajuda de um mecanismo tão simples, também aqui temos uma proteção que não pode ser pirateada.
A validade da impressão digital recebida pelo servidor é verificada pelo procedimento check_finger_print (que é chamado no servidor no procedimento 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; }
Para além de verificar a validade do cliente contactado, o check_finger_print, como se pode facilmente verificar neste código, realiza uma série de operações preparatórias chamando o procedimento get_fingerprint_items. Com a sua ajuda, a partir de um objeto de impressão digital com uma estrutura
typedef struct finger_print { unsigned char mixed_item[ITEM_SIZE * 2 * 3]; unsigned char mixed_hash[HARD_HASH_SIZE]; } FINGERPRINT;
num objeto THREADDATA com a estrutura
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;
São extraídos os identificadores de subscritor (client_id e server_id), o tipo de ligação (client_mode) e o tamanho do prolog (prolog_size). Todos estes parâmetros, aliás, são absolutamente necessários para o procedimento connect_server chamado no servidor central (no procedimento dispatch_call) imediatamente após check_finger_print. Na verdade, toda a operação do connect_server (como se pode facilmente verificar no seu código) é baseada exclusivamente nestes quatro parâmetros.
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 |