Цифровые отпечатки 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 |
|