Extra Systems

CYPHERNET

file di impronte digitali


Le impronte digitali contengono due identificatori dell'abbonato (client_id e server_id), il tipo di connessione (CLIENT_MODE), nonché la dimensione del prologo (attraverso il quale la chiave di sessione viene negoziata tra gli abbonati durante la procedura get_common_key) con un "salt" casuale (diverso per ogni client), protetto da un hash e crittografato tramite RSA con la chiave pubblica (solo nominativamente) del server centrale. Va sottolineato che non pubblichiamo questa chiave da nessuna parte e non la trasferiamo a nessuno, ecco perché effettuiamo la produzione delle impronte digitali. Questa politica di sicurezza di Extra Systems priva completamente qualsiasi utente malintenzionato della possibilità di hackerare il sistema Cypher Net in quest'area.

Il salvataggio della dimensione del prologo nel file delle impronte digitali è necessario per garantire il corretto funzionamento della procedura connect_server sul server centrale. Il fatto è che in diverse distribuzioni la dimensione dell'hash può differire, il che porterebbe a una modifica della dimensione del prologo. Il server centrale di Extra Systems Cypher Net non approfondisce tutte queste sottigliezze, ma garantisce solo il trasferimento tra gli abbonati di un oggetto, la cui dimensione riceve dall'impronta digitale nella variabile prolog_size.

I file delle impronte digitali vengono creati da noi (al momento della consegna del prodotto al cliente) utilizzando il seguente 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);
}

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


© Extra Systems, 2024 Extra Web Top