Digitale Fingerabdrücke enthalten zwei Abonnenten-IDs (client_id und server_id), den Verbindungstyp (CLIENT_MODE) sowie die Größe des Prologs (durch den der Sitzungsschlüssel zwischen Abonnenten während der get_common_key-Prozedur ausgehandelt wird) mit einem zufälligen „Salt“ (verschieden für pro Client), geschützt durch einen Hash und verschlüsselt mittels RSA mit dem öffentlichen (nur namentlich genannten) Schlüssel des zentralen Servers. Es ist zu betonen, dass wir diesen Schlüssel nirgendwo veröffentlichen und an niemanden weitergeben – daher wird die Erstellung der Fingerabdrücke von uns durchgeführt. Diese Sicherheitsrichtlinie von Extra Systems nimmt jedem Angreifer die Möglichkeit, das Cypher Net-System in diesem Bereich zu hacken.
Das Speichern der Prologgröße in der Fingerabdruckdatei ist notwendig, um den korrekten Betrieb der connect_server-Prozedur auf dem zentralen Server sicherzustellen. Tatsache ist, dass in verschiedenen Distributionen die Hash-Größe unterschiedlich sein kann, was zu einer Änderung der Größe des Prologs führen würde. Der zentrale Server von Extra Systems Cypher Net geht nicht auf alle diese Feinheiten ein, sondern sorgt lediglich für die Übertragung zwischen Abonnenten eines Objekts, dessen Größe er aus dem Fingerabdruck in der Variablen prolog_size erhält.
Fingerabdruckdateien werden von uns (zum Zeitpunkt der Lieferung des Produkts an den Kunden) mithilfe des folgenden Algorithmus erstellt:
#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); }
Der Inhalt dieser Seite ist auch in Englisch, Französisch, Portugiesisch, Spanisch, Italienisch, Ukrainisch und Russisch verfügbar.
© Extra Systems, 2024 |
|