Extra Systems

CYPHERNET

procedura check_finger_print (identificazione dell'utente sul server centrale)


Va notato che il meccanismo dell'impronta digitale stesso, che abbiamo inventato in questo sistema di crittografia Extra Systems Cypher Net, funge da uno dei meccanismi per proteggere il server centrale dagli attacchi degli hacker. Quando riceve una richiesta di connessione da un client astratto (che potrebbe essere un utente malintenzionato), il server si aspetta di ricevere immediatamente da esso l'impronta digitale corretta. Se ciò non accade, il server non avvia più alcuna conversazione con tale client e interrompe immediatamente la connessione. Ricordiamo che poiché i file delle impronte digitali vengono crittografati tramite RSA con la chiave pubblica (solo nominativa) del server, che in realtà non viene pubblicata da nessuna parte, è assolutamente impossibile falsificarli.

Quindi, con l'aiuto di un meccanismo così semplice, anche qui abbiamo una protezione che non può essere violata.

La validità dell'impronta digitale ricevuta dal server viene verificata dalla procedura check_finger_print (che viene richiamata sul server nella procedura 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;
}

Check_finger_print, oltre a verificare la validità del cliente contattato, come si può facilmente vedere da questo codice, effettua una serie di operazioni preparatorie richiamando la procedura get_fingerprint_items. Con il suo aiuto, dall'impronta digitale dell'oggetto che ha la struttura

typedef struct finger_print
{
	unsigned char mixed_item[ITEM_SIZE * 2 * 3];
	unsigned char mixed_hash[HARD_HASH_SIZE];
} FINGERPRINT;

в объект THREADDATA, имеющий структуру

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;

vengono recuperati gli identificatori dell'abbonato (client_id e server_id), il tipo di connessione (client_mode) e la dimensione del prolog (prolog_size). Tutti questi parametri sono assolutamente necessari per la procedura connect_server richiamata sul server centrale (nella procedura dispatch_call) subito dopo check_finger_print. Infatti tutto il funzionamento di connect_server (come si può facilmente vedere dal suo codice) si basa esclusivamente su questi quattro parametri.

Il contenuto di questa pagina è disponibile anche in inglese, francese, tedesco, portoghese, spagnolo, ucraino e russo.


© Extra Systems, 2024 Extra Web Top