Extra Systems

CYPHERNET

файли fingerprint


Цифрові відбитки fingerprint містять два абонентські ідентифікатори (client_id і server_id), тип з'єднання (CLIENT_MODE), а також розмір прологу (за допомогою якого узгодження сеансового ключа між абонентами під час виконання процедури get_common_key) з випадковою "сіллю" (різною для кожного клієнта), захищені хешом і зашифровані по RSA відкритим (тільки за назвою) ключем центрального сервера. Слід наголосити, що нами цей ключ ніде не публікується і нікому не передається - саме тому виготовлення відбитків fingerprint здійснюється нами. Така безпекова політика Extra Systems повністю позбавляє будь-якого зловмисника можливості зламати систему Cypher Net і на цій ділянці.

Зберегти розмір прологу у файлі fingerprint необхідно з метою забезпечення правильної роботи процедури connect_server на центральному сервері. Справа в тому, що в різних поставках розмір хеша може відрізнятися, що призвело до зміни розміру прологу. Центральний сервер Extra Systems Cypher Net у всі ці тонкощі не вникає, а лише забезпечує пересилання між абонентами об'єкта, розмір якого він отримує з fingerprint у змінній prolog_size.

Файли fingerprint створюються нами (у момент передачі виробу замовнику) за допомогою такого алгоритму:

#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);
}

Контент цієї сторінки доступний також англійською, французькою, німецькою та російською мовами.


© Extra Systems, 2024 Extra Web Top