Extra Systems

CYPHERNET

Procedimiento check_finger_print (identificación del abonado en el servidor central)


Cabe señalar que el mecanismo de huellas dactilares en sí, que inventamos en este sistema de cifrado Cypher Net de Extra Systems, sirve como uno de los mecanismos para proteger el servidor central de los ataques de piratas informáticos. Al recibir una solicitud de conexión de un cliente abstracto (que puede ser un atacante), el servidor espera recibir inmediatamente la huella digital correcta del mismo. Si esto no sucede, el servidor no mantiene más conversaciones con dicho cliente y finaliza inmediatamente la conexión. Le recordamos que, dado que los archivos de huellas dactilares se cifran a través de RSA con la clave pública (sólo de nombre) del servidor, que en realidad no se publica en ninguna parte, es absolutamente imposible falsificarlos.

Así, con la ayuda de un mecanismo tan simple, también aquí tenemos una protección que no puede ser pirateada.

La validez de la huella digital recibida por el servidor se verifica mediante el procedimiento check_finger_print (que se llama en el servidor en el procedimiento 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;
}

Además de comprobar la validez del cliente contactado, check_finger_print, como se puede ver fácilmente en este código, realiza una serie de operaciones preparatorias llamando al procedimiento get_fingerprint_items. Con su ayuda, a partir de un objeto de huellas dactilares que tiene la estructura

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

en un objeto THREADDATA que tiene la estructura

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;

Se extraen los identificadores de suscriptor (client_id y server_id), el tipo de conexión (client_mode) y el tamaño del prólogo (prolog_size). Todos estos parámetros, por cierto, son absolutamente necesarios para el procedimiento connect_server llamado en el servidor central (en el procedimiento dispatch_call) inmediatamente después de check_finger_print. De hecho, todo el funcionamiento de connect_server (como se puede ver fácilmente en su código) se basa únicamente en estos cuatro parámetros.

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 Extra Web Top