UUID
UUID ( identificatore univoco universale inglese "Universal Unique Identifier") è uno standard di identificazione utilizzato nello sviluppo di software , standardizzato dalla Open Software Foundation (OSF) come parte di DCE - Distributed Computing Environment. Lo scopo principale di UUID è consentire ai sistemi distribuiti di identificare in modo univoco le informazioni senza una stanza di compensazione. Pertanto, chiunque può creare un UUID e usarlo per identificare qualcosa con un ragionevole livello di sicurezza che l'identificatore fornito non verrà mai utilizzato inavvertitamente per qualcos'altro. Pertanto, le informazioni contrassegnate con un UUID possono essere inserite successivamente in un database condiviso senza la necessità di risolvere i conflitti di nome. L'uso più comune di questo standard è il Globally Unique Identifier ( GUID ) di Microsoft . Altri utenti significativi sono Linux ( file system ext2 / ext3 , LUKSpartizioni crittografate, GNOME , KDE ) e Mac OS X utilizzano tutti un'implementazione derivata dalla libreria uuid trovata nel pacchetto e2fsprogs.
Standard
L' UUID è documentato come parte di ISO / IEC 11578:1996 " Information technology - Open Systems Interconnection - Remote Procedure Call (RPC)" e successivamente in ITU-T Rec. X.667 | ISO / IEC 9834-8:2008. L'IETF ha pubblicato una proposta di standard , RFC 4122 , che è tecnicamente identica a ITU-T Rec. X.667 | ISO/IEC 9834-8.
Formato
L'UUID è un numero a 16 byte (128 bit ). Nella sua rappresentazione canonica, un UUID è rappresentato come un numero esadecimale separato da trattini in cinque gruppi nel formato 8-4-4-4-12. Questa rappresentazione richiede 36 caratteri:
123e4567-e89b-12d3-a456-426655440000xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
I 4 bit Mindicano la versione ("versione") dell'UUID e gli 1-3 bit più significativi Nindicano la variante ("variante") dell'UUID.
Questo raggruppamento si basa sulla struttura UUID:
| Nome campo | Lunghezza (in byte) | Lunghezza (numero di cifre esadecimali) | Contenuto |
|---|---|---|---|
| tempo_basso | quattro | otto | un numero intero che denota i 32 bit inferiori del tempo |
| tempo_metà | 2 | quattro | un numero intero che denota la media di 16 bit di tempo |
| time_hi_and_version | 2 | quattro | I 4 bit più significativi indicano la versione dell'UUID, i bit meno significativi indicano i 12 bit più significativi del tempo |
| clock_seq_hi_and_res clock_seq_low | 2 | quattro | 1-3 bit alti indicano la variante UUID, i restanti 13-15 bit indicano la sequenza di clock |
| nodo | 6 | 12 | ID host a 48 bit |
Questi campi corrispondono alle versioni UUID 1 e 2, che vengono generate in base al tempo, ma la rappresentazione 8-4-4-4-12 viene utilizzata per qualsiasi versione UUID.
RFC 4122 definisce anche uno spazio dei nomi URN per gli UUID:
urn:uuid:123e4567-e89b-12d3-a456-426655440000
Il GUID di Microsoft viene talvolta utilizzato con parentesi graffe:
{123e4567-e89b-12d3-a456-426655440000}
Il numero totale di chiavi UUID univoche (escluse le versioni) è 2128 = 25616 o circa 3,4 × 1038 . Ciò significa che generando 1 trilione di chiavi ogni nanosecondo , ci vorranno solo 10 miliardi di anni per ordinare tutti i valori possibili.
Un UUID con un identificatore speciale può essere riutilizzato intenzionalmente per identificare la stessa entità in contesti diversi. Ad esempio, in Microsoft Component Object Model , ogni componente deve supportare l'interfaccia standard " IUnknown ". Per fare ciò, viene creato un UUID che rappresenta " IUnknown ". In tutti i casi in cui viene utilizzato " IUnknown " - quando si accede ai processi all'interfaccia " IUnknown " nel componente, o per implementare il supporto dell'interfaccia " IUnknown " da parte del componente stesso - si fa sempre riferimento allo stesso identificatore: 00000000-0000-0000-C000-000000000046.
Codifica
La rappresentazione binaria di un UUID varia su diversi sistemi.
La maggior parte dei sistemi codifica l'UUID interamente in big-endian . Ad esempio, 00112233-4455-6677-8899-aabbccddeeffcodificato in byte 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff.
Alcuni sistemi, ad esempio il marshalling nelle librerie COM/OLE Microsoft , usano mixed-endian , in cui i primi tre componenti dell'UUID sono codificati come little-endian e gli ultimi due come big-endian. Ad esempio, 00112233-4455-6677-8899-aabbccddeeffin questo caso è codificato come 33 22 11 00 55 44 77 66 88 99 aa bb cc dd ee ff.
Opzioni
Per ragioni storiche, l'UUID ha diverse varianti, denotate da uno, due o tre bit.
Opzione 0
Una delle opzioni definite in RFC 4122 , opzione 0 (indicata da un singolo bit 0xxx 2 , N = 0..7), è presente per la retrocompatibilità con l'obsoleto formato UUID Apollo Network Computing System 1.5 sviluppato intorno al 1988. In questo formato, i primi 6 ottetti dell'UUID sono un timestamp a 48 bit (il numero di unità di tempo di 4 microsecondi trascorsi dal 1 gennaio 1980 UTC); i successivi 2 ottetti sono riservati; l'ottetto successivo è "address family"; gli ultimi 7 ottetti sono l'ID host a 56 bit nella forma specificata dalla famiglia di indirizzi. Nonostante la differenza nei dettagli, si può vedere la somiglianza con l'UUID moderno della versione 1. I bit varianti nell'attuale specifica UUID sono gli stessi dei bit alti dell'ottetto della famiglia di indirizzi nell'UUID NCS. Sebbene una famiglia di indirizzi possa contenere valori nell'intervallo 0..255, sono stati definiti solo i valori 0..13. Pertanto, designare l'opzione 0 come 0xxxevita conflitti con gli UUID NCS storici se esistono ancora nei database.
Opzioni 1 e 2
Queste varianti sono utilizzate nelle attuali specifiche UUID. L'opzione 1 (indicata da due bit 10xx 2 N = 8..b) è quella principale ed è descritta in RFC 4122 . L'opzione 2 (indicata dai tre bit 110x 2 N = c..d) è descritta nell'RFC come riservata alla compatibilità con le versioni precedenti con i primi GUID di Microsoft Windows .
A parte i bit delle varianti, i due UUID sono per il resto gli stessi, tranne per il fatto che quando codificati in forma binaria per l'archiviazione o la trasmissione, gli UUID della variante 1 utilizzano l'ordine dei byte di rete (big-endian), mentre i GUID della variante 2 utilizzano l'ordine dei byte nativo. -endian) ordine dei byte. Nella rappresentazione testuale canonica, le opzioni 1 e 2 sono le stesse tranne che per i bit di opzione.
Sebbene alcuni GUID importanti, come l'identificatore di interfaccia IUnknown per COM, siano UUID variante 2, molti degli identificatori creati e utilizzati nel software Microsoft Windows e denominati "GUID" sono in realtà UUID variante 1 standard in ordine di byte di rete. La versione corrente dell'utilità Microsoft guidgengenera UUID variante standard 1. Alcuni documenti Microsoft affermano che "GUID" è un sinonimo di "UUID", [1] come standardizzato in RFC 4122 . La stessa RFC 4122 afferma che gli UUID sono anche noti come GUID ("sono noti anche come GUID"). Tutto ciò suggerisce è che "GUID", sebbene originariamente una variante separata dell'UUID utilizzato da Microsoft, è ora diventato solo un nome alternativo per l'UUID standard.
Opzione 3
In RFC 4122 , 111x 2 ( N = e..f) è riservato per un uso futuro.
Versioni
Lo standard definisce cinque versioni ("versione") di UUID, ognuna delle quali può essere migliore o peggiore in determinate situazioni.
UUID nullo
Un caso speciale in cui tutti i bit UUID sono impostati su zero: 00000000-0000-0000-0000-000000000000.
Versione 1 (ora e indirizzo MAC)
La versione 1 include l' indirizzo MAC a 48 bit del nodo ("nodo") su cui è stato generato l'UUID e un timestamp (timestamp) a 60 bit che indica il numero di intervalli di 100 ns trascorsi dalla mezzanotte del 15 ottobre, 1582 UTC — data di inizio dell'uso del calendario gregoriano . RFC 4122 specifica un tempo massimo possibile intorno al 3400 d.C. e., il che significa che il timestamp a 60 bit è firmato. Tuttavia, alcuni programmi, come la libreria libuuid, considerano il timestamp non firmato [2] e per loro il tempo massimo è intorno al 5236 d.C. e.
Una sequenza di clock a 13 o 14 bit riempie il timestamp nei casi in cui l'orologio di sistema non viene aggiornato abbastanza velocemente o su sistemi multiprocessore. In questi casi, UUID diversi possono avere lo stesso timestamp. Per evitare di generare gli stessi UUID, viene utilizzata una sequenza di clock, che viene aggiornata ogni volta che viene creato un nuovo UUID e che sarà diversa per UUID diversi anche se i timestamp corrispondono. Poiché gli UUID della versione 1 corrispondono a un singolo punto nello spazio (nodo) e nell'ora (marcatura temporale e sequenza dell'orologio), la possibilità che due UUID generati correttamente corrispondano è praticamente zero. Poiché il timestamp e la sequenza di clock insieme sono 74 bit, è possibile generare un totale di 2 74 (1.8⋅10 22 o 18 sestilioni ) UUID versione 1 univoci su un singolo nodo a una velocità media massima di 163 miliardi di UUID al secondo.
A differenza di altre versioni di UUID, l'unicità degli UUID versione 1 e versione 2 basati su indirizzi MAC NIC dipende in parte da un identificatore emesso da un'autorità di registrazione centrale, ovvero la parte Organization Unique Identifier (OUI) dell'indirizzo MAC, che viene emesso dai produttori di apparecchiature di rete IEEE . [3] L'unicità dipende anche dalla corretta assegnazione di indirizzi MAC univoci da parte dei produttori di schede NIC, che, come altri processi di produzione, sono soggetti a errori.
L'utilizzo dell'indirizzo MAC significa che puoi sempre rintracciare il computer che ha creato l'UUID. A volte è possibile trovare il computer su cui è stato creato o modificato un documento se l'elaboratore di testi utilizzato ha l'UUID incorporato nel file. Questo buco nella privacy è stato utilizzato per trovare l'autore del virus Melissa . [quattro]
Versione 2 (ora, indirizzo MAC e versione di sicurezza DCE)
RFC 4122 riserva la versione 2 "Sicurezza DCE" ma non fornisce alcun dettaglio al riguardo. Per questo motivo, molte implementazioni UUID non hanno la versione 2. Tuttavia, l'UUID versione 2 è descritto nella specifica DCE 1.1 Authentication and Security Services. [5]
La versione 2 è simile alla versione 1, ma gli 8 bit inferiori della sequenza di clock vengono sostituiti con un numero di "dominio locale" e i 32 bit inferiori del timestamp vengono sostituiti con un identificatore intero significativo all'interno del dominio locale specificato.
La possibilità di includere un dominio/identificatore a 40 bit è un compromesso. Da un lato, 40 bit consentono circa 1 trilione di valori di dominio/identificatore per un singolo nodo. D'altra parte, con il timestamp ridotto a 28 MSB da 60 bit nella versione 1, l'UUID versione 2 segnerà solo il tempo ogni 429,49 secondi (poco più di 7 minuti), invece di 100 nanosecondi nella versione 1. E con il 6 -bit sequenza di clock, a differenza dei 14 bit della versione 1, durante quei 7 minuti possono essere generati solo 64 UUID univoci per un singolo host/dominio/id. Pertanto l'UUID versione 2 non è appropriato se si desidera generare un UUID più di una volta ogni 7 minuti.
Versioni 3 e 5
Gli UUID delle versioni 3 e 5 vengono generati mediante l'hashing di un identificatore di spazio dei nomi e di un nome. La versione 3 utilizza l'algoritmo di hashing MD5 , la versione 5 utilizza SHA-1 .
La specifica fornisce un UUID per rappresentare gli spazi dei nomi dei nomi distinti URL , FQDN , OID e X.500 , ma qualsiasi UUID desiderato può essere utilizzato come identificatore dello spazio dei nomi.
Per calcolare l'UUID della versione 3 corrispondente a un determinato spazio dei nomi e nome, l'UUID dello spazio dei nomi viene convertito in un byte, concatenato con il nome e sottoposto a hash con l'algoritmo MD5, ottenendo 128 bit. I 6 o 7 bit vengono quindi sostituiti con valori fissi: una versione a 4 bit (ad esempio 0011 2 per la versione 3) e una variante a 2 o 3 bit dell'UUID (ad esempio 10 2 , che sta per RFC 4122 UUID, o 110 2 , che denota il GUID Microsoft legacy). Poiché sono quindi predefiniti 6 o 7 bit, solo 121 o 122 bit contribuiscono all'unicità dell'UUID.
L'UUID della versione 5 è simile ma utilizza SHA-1 invece di MD5. Poiché SHA-1 fornisce un hash a 160 bit, viene pretroncato a 128 bit.
L'essenza delle versioni UUID 3 e 5 è che la stessa coppia dello spazio dei nomi e del nome verrà mappata sullo stesso UUID. In questo caso, né lo spazio dei nomi né il nome possono essere recuperati dall'UUID, se non con la forza bruta.
RFC 4122 consiglia di utilizzare la versione 5 anziché la versione 3 e non consiglia di utilizzare nessuna delle due versioni come credenziali di sicurezza.
Versione 4 (casuale)
L'UUID della versione 4 viene generato in modo casuale. Come con altre versioni dell'UUID, 4 bit vengono utilizzati per indicare la versione, 2 o 3 bit indicano la variante. Quindi per la variante 1 (che viene utilizzata dalla maggior parte degli UUID), ci sono 122 bit per parte generata casualmente, che fornisce 2122 o 5.3⋅10 36 (5.3 undecillion ) possibili UUID della versione 4 della variante 1. UUID della versione 4 della variante 2 ha la metà delle opzioni possibili, poiché un bit in più viene utilizzato per designare una variante.
Note
- ↑ Identificatori univoci a livello globale . Rete di sviluppatori Microsoft . Microsoft . Estratto il 18 giugno 2019 . Archiviato dall'originale il 13 febbraio 2019.
- ↑ ext2/e2fsprogs.git - Utilità spazio utente del filesystem Ext2/3/4 . kernel.org . Estratto: 9 gennaio 2017. (link non disponibile)
- ^ The Institute of Electrical and Electronics Engineers, Incorporated (IEEE). Autorità di registrazione (non specificata) . — 1963.
- ^ Reiter, Luke che segue l'alter ego di Melissa . Rete ZD . CBS Interactive (2 aprile 1999). Data di accesso: 16 gennaio 2017 Archiviata dall'originale il 21 ottobre 2012.
- ↑ DCE 1.1: Servizi di autenticazione e sicurezza . Il gruppo aperto. Estratto il 18 giugno 2019 . Archiviato dall'originale il 7 dicembre 2010.
Collegamenti
- RFC 4122 - Uno spazio dei nomi URN Universally Unique IDentifier (UUID).
- Funzione di registrazione UUID globale presso ITU-T
- Progettazione e crittoanalisi del generatore UUID in Windows OS