Universally unique identifier

système permettant d'identifier de façon unique une information

En informatique un Universally unique identifier (UUID), de l'anglais signifiant littéralement « identifiant unique universel », également appelé Globally unique identifier (GUID) lorsqu'il est utilisé en contexte Microsoft, est un système permettant à des systèmes distribués d'identifier de façon unique une information sans coordination centrale importante[1],[2],[3]. Dans ce contexte, le mot « unique » doit être pris au sens de « unicité très probable » plutôt que « garantie d'unicité ». Il s'agit d'une spécification DCE définie initialement par l'OSF (Open Software Foundation).

Cette spécification a été enrichie par la RFC 4122[4], en 2005, qui standardise des algorithmes de génération n'utilisant pas d'adresse matérielle. L'UUID est normalisé par l'ISO/IEC 9834-8:2008 qui prend en compte les algorithmes OSF, RFC 4122[4], mais aussi certains nommages « propriétaires ». La RFC 4122 a été remplacé par la RFC 9562 en mai 2024[5].

Ces identifiants uniques sont codés sur 128 bits et peuvent être produits en utilisant des composantes pseudo-aléatoires ainsi que les caractéristiques d'un ordinateur (numéro de disque dur, adresse MAC, etc.).

Un UUID est initialement conçu de manière à être unique dans le monde ; cependant, les algorithmes de hachage et les générateurs pseudo-aléatoires introduisent un risque non nul que deux ordinateurs produisent un même identifiant. La norme ISO définit d'ailleurs des « identificateurs de 128 bits qui sont soit garantis mondialement uniques ou sont mondialement uniques avec une forte probabilité ». Quant à la RFC 4122[4], si elle parle d'identificateur unique, elle précise que les identificateurs issus d'espaces de noms différents sont seulement « différents avec une forte probabilité » (§4.3).

Les UUID sont destinés à l'identification de composants logiciels (plugins), des différents membres dans un système distribué ou d'autres applications nécessitant une identification sans ambiguïté. Les UUID peuvent être générés sur les systèmes Unix via la commande uuidgen. Sous debian, le paquet e2fsprogs contient une commande /sbin/blkid qui permet d'afficher un UUID correspondant à certains périphériques (paquet util-linux sous RedHat/CentOS).

Dans sa représentation textuelle canonique, les 16 octets d'un UUID sont représentés comme 32 chiffres hexadécimaux en minuscules séparés par 4 tirets sous la forme suivante: 123e4567-e89b-12d3-a456-426614174000 ........-....-M...-N...-............

Les 4 bits de M et les bits de 1 à 3 de N déterminent le format de l'UUID.

M représente la version utilisée par l'UUID alors que N représente la variante, dans l'exemple M vaut 1 et N vaut 10.., indiquant un UUID version-1 variant-1, c'est-à-dire un UUID basé sur la date DCE/RFC 4122.

La RFC 4122 Section 3 stipule que les caractères sont affichés en minuscules même si les majuscules sont permises lors d'une saisie.

Les GUIDs de Microsoft sont parfois représentés avec des accolades : {123e4567-e89b-12d3-a456-426652340000}

RFC 4122 définit une Uniform Resource Name (URN) namespace pour les UUIDs. Un UUID représenté comme un URN s'affiche sous la forme suivante: urn:uuid:123e4567-e89b-12d3-a456-426655440000

Algorithmes de génération

modifier

L'algorithme de génération diffère selon la version. La première version du standard prévoyait de générer l'identifiant avec l'adresse MAC de l'ordinateur et un temps écoulé (en dixièmes de microseconde) depuis une date de référence. L'UUID produite est unique, sous réserve qu'une même adresse MAC ne soit pas utilisée pour plusieurs cartes réseaux et qu'il n'y ait pas deux identifiants produits en moins de 0,1μs.

Cependant, l'utilisation de l'adresse MAC a un effet pervers : donner des informations sur l'ordinateur qui a généré l'identifiant. Des améliorations ont été entreprises et standardisées par la RFC 4122[4] (puis normalisées ISO). On peut maintenant faire appel à des nombres pseudo-aléatoires (version 4) et à des fonctions de hachage cryptographiques comme MD5 (version 3) ou SHA-1 (version 5) qui permettent de « casser » toute information relative à l'ordinateur qui a produit l'UUID. Le langage Java 5.0 utilise une variante de la génération de type Leach-Salz dont la spécification a expiré. Toutes ces techniques introduisent cependant une incertitude sur l'unicité de l'identifiant (une séquence pseudo-aléatoire peut sortir deux fois le même résultat, et les algorithmes de hachage ne sont pas bijectifs), la probabilité d'unicité dépend alors de la robustesse de l'algorithme.

Enfin la multiplication de techniques concurrentes non standardisées a fragilisé la robustesse de l'UUID dans ses différentes utilisations (c'est ce qui a motivé la rédaction de la RFC en plus du standard OSF).

Versions

modifier

Version 1

modifier

La version 1 crée un UUID en se basant sur l'adresse MAC et l'horodatage. Il garantit la génération d'un identifiant unique (pour deux systèmes avec des adresses MAC différentes et agissant à plus de 0,1μs d'écart). Il permet également sur la même machine, de générer jusqu'à 10 millions d'UUID uniques par seconde.

L'adresse MAC est codée sur 48 bits. L'horodatage est codé sur 74 bits, avec un "timestamp" de 60 bits, correspondant au nombre de dixièmes de micro-secondes écoulées depuis le 15 Octobre 1582 à minuit (UTC), considérée comme le début du calendrier grégorien, suivi d'un "clockmark" de 14 bits. Certaines versions de l'algorithme de génération assurent l'unicité de plusieurs identifiants produits en parallèle par les valeurs données aux derniers bits du "clockmark".

Version 2

modifier

D'après la RFC 4122[4] la version 2 est une variante DCE (« Distributed Computing Environment ») qui inclut des UIDs POSIX.

Version 3

modifier

La version 3 est un hash md5 d'un nom (comme une URL ou un OID). L'UUID généré sera toujours égal pour un même nom, il ne contient donc aucun aspect temporal ou aléatoire.

Version 4

modifier

La version 4 génère un UUID totalement aléatoire.

Version 5

modifier

La version 5 est un hash sha1 d'un nom (comme une URL ou un OID). Comme pour la version 3, l'UUID généré sera toujours égal pour un même nom.

Version 6

modifier

La version 6 est identique à la version 1, sauf que tous les bits de temps sont placés dans l'ordre inverse. Cela permettra aux systèmes de trier dans l'ordre de création par UUID, ce qui n'était pas possible avec la version 1.

Version 7

modifier

L'UUIDv7 est l'une des versions de l'UUID qui est basée sur le temps, comme l'UUIDv1.

Les UUID version 7 (UUIDv7) sont conçus pour les clés des bases de données à forte charge et des systèmes distribués.

L'UUIDv7 commence par un horodatage Unix Epoch de 48 bits gros-boutiste avec une granularité d'environ une milliseconde. L'horodatage peut être décalé de n'importe quelle valeur de décalage temporel. Directement après l'horodatage suit le quartet de la version, qui doit avoir une valeur de 7. Les bits de variante doivent être 10xx[6]. Les 74 bits restants sont des compteurs aléatoires (facultatifs, au moins 12 bits mais pas plus de 42 bits) et aléatoires.

Version 8

modifier

La version 8 de l'UUID fournit un format compatible RFC pour les cas d'utilisation expérimentaux ou spécifiques à un fournisseur.

La version 8 n'a que deux exigences :

  • Les bits de variante doivent être 10xx[6].
  • Le quartet de la version doit avoir la valeur 8.

Ces exigences indiquent au système qu'il s'agit d'un UUID de la version 8. Les 122 bits restants sont laissés à l'appréciation du fournisseur. La différence avec la version 4 est que ces 122 bits sont aléatoires, alors que les 122 bits de la version 8 de l'UUID ne le sont pas, car ils suivent des règles spécifiques au fournisseur.


Un GUID (abréviation de l'anglais Globally Unique IDentifier, en français : « identificateur global unique »[7]) sert habituellement d'identifiant unique pour un composant logiciel, par exemple un plugin. Sa taille est de 16 octets, soit 128 bits (exemple : {3F2504E0-4F89-11D3-9A0C-0305E82C3301}), décomposés en :

  • 4 octets ;
  • trois groupes de 2 octets ;
  • 6 octets.

Ce terme est utilisé à la fois dans le monde Microsoft et dans le monde Unix (voir RFC 4122[4]). Microsoft utilise le terme de CLSID (de l'anglais class identifier) pour désigner le GUID de la classe d'un objet OLE, et le terme IID (de l'anglais Interface IDentifier) pour les interfaces mises en œuvre par ces classes.

Sous Unix, on utilise le UUID.

Concernant les disques durs, on utilise maintenant les tables de partitionnement GUID, en anglais GUID Partition Table (GPT).

Versions

modifier

Quatre versions ont été spécifiées par Microsoft :

  • version 1 : fondée sur l’horloge de l'ordinateur et l’adresse MAC (avant Windows 2000) ;
  • version 2 : réservée (non utilisée en pratique) ;
  • version 3 : fondée sur un nom, les différents champs sont produits à partir de ce nom ;
  • version 4 : fondée sur des nombres issus d’un générateur de nombres pseudo-aléatoires cryptographique (Windows 2000 et ultérieur).

Sur les 128 bits (dont 4 bits pour la version et 2 pour la variante), seuls 122 sont réellement aléatoires, ce qui représente environ 5 × 1036 combinaisons possibles.

GUID et CLSID de Microsoft

modifier

Des GUID sont aussi insérés dans des documents Microsoft Office. Même les flux audio et vidéo dans le codec ASF sont identifiés par un GUID.

Dans le modèle COM (utilisé par ActiveX), les CLSID sont utilisés uniquement pour différencier les classes des objets. Cela veut dire que deux versions d'un composant peuvent avoir exactement le même nom, mais être discernables par leur CLSID. Chacune de ces classes supporte différentes interfaces identifiées chacune par un IID.

Base de registre de Microsoft

modifier

La base de registre de Windows contient de nombreux GUID, CLSID et IID.

En particulier, la clé HKEY_CLASSES_ROOT\CLSID (équivalent à HKEY LOCAL MACHINE\SOFTWARE\Classes\CLSID\) contient de très nombreux CLSID.

Certains logiciels espions ajoutent des CLSID. N'étant pas très lisibles, l'opération peut passer inaperçue même pour un utilisateur averti qui connaît le maniement de regedit. Pour donner un exemple de logiciel espion modifiant les CLSID, on peut mentionner : Parent Tools, en et PC Watch en (exemples indiqués par Symantec) [réf. nécessaire].

Dans certaines versions de Windows, les clés de registre HWID (Hardware ID) et MSID (Microsoft ID) servent pour générer un GUID identifiant un ordinateur de façon unique (dans l'arborescence CurrentControlSet de HKEY_LOCAL_MACHINE). Certains logiciels anti-spyware les éliminent.

Active Directory

modifier

Dans l'annuaire Active Directory, l'attribut ObjectGUID est le GUID qui sert d'identifiant pour un objet : il ne change jamais, même si l'objet change de nom ou s'il est déplacé.

Minecraft

modifier

Dans le jeu vidéo Minecraft, les UUID (identifiants uniques pour chaque joueur) prennent la forme d'un GUID.

Programmation sous Windows

modifier

Dans l'API Win32, UUIDCreate() est la fonction de base pour créer un GUID. La fonction CoCreateGuid est une fonction qui enrobe UUIDCreate et qui permet de créer un CLSID.

Dans Visual Basic, Guid est un attribut d'un objet Active Directory.

Interface en ligne de commande

modifier

UUIDGEN.EXE est un utilitaire de Microsoft permettant de générer un GUID. Dans le monde Microsoft, il fait partie de Microsoft Exchange Server 2003. Il ne faut pas le confondre avec la commande uuidgen du monde Unix.

GUIDGEN.EXE est un utilitaire de Microsoft permettant lui aussi de générer un GUID. Il est livré avec Visual Studio.

Anecdote

modifier

En 1999, l'auteur du ver Melissa a été identifié en partie grâce au champ GUID de documents Microsoft Office qui, à l'époque, contenaient l'adresse MAC. Ce ver exploitait une faiblesse de Word 97. Dans les versions suivantes des logiciels Microsoft, l'algorithme qui génère le GUID a été modifié pour respecter la vie privée des utilisateurs : l'adresse MAC a été retirée.

Autres significations

modifier

GUID est aussi le nom d'une balise XML pour RSS (standard de syndication du contenu). Cette balise utilisée par le RSS ne se réfère pas à la norme RFC 4122[4]. La structure est totalement différente : il contient un texte. En pratique, ce texte correspond à l'URL.

Il existe une balise équivalente dans Atom, un autre standard de syndication du contenu. Cette balise s'appelle ID et contient un URI.

Voir aussi

modifier

Liens externes

modifier

Notes et références

modifier

Références

modifier
  1. (en) Barrie A. Sosinsky, chap. 4 « Active Directory », dans Microsoft Windows Server 2008: Implementation and Administration, John Wiley & Sons, (lire en ligne).
  2. (en) Kalen Delaney, chap. 6 « Table Storage », dans Kalen Delaney et Craig Freeman, {{Chapitre}} : paramètre titre ouvrage manquant, Microsoft Press, (lire en ligne).
  3. (en) Grace Agnew, « The resource in digital rights management », dans Digital Rights Management: A Librarian’s Guide to Technology and Practise, Chandos Publishing -Elsevier, (lire en ligne), UUID/GUID (Universally unique identifier).
  4. a b c d e f et g (en) Request for comments no 4122
  5. (en) Kyzer R. Davis, Brad Peabody et P. Leach, « Universally Unique IDentifiers (UUIDs) : RFC 9562 », (ISSN 2070-1721, consulté le )
  6. a et b (en) « RFC 9562 - Variant Field »
  7. (en) Traduction Microsoft Terminology Collection.