Dans quelle mesure est-il sûr d'utiliser UUID pour identifier de manière unique quelque chose (je l'utilise pour les fichiers téléchargés sur le serveur)? Si je comprends bien, il est basé sur des nombres aléatoires. Cependant, il me semble qu'avec suffisamment de temps, il finirait par se répéter, par pur hasard. Existe-t-il un meilleur système ou un modèle quelconque pour atténuer ce problème?
guid
uniqueidentifier
uuid
Jason
la source
la source
Réponses:
Très sûr:
Caveat:
Source: section Probabilité de doublons de l'UUID aléatoire de l'article de Wikipédia sur les identificateurs uniques (lien Universellement conduit à une révision à partir de Décembre 2016 avant l' édition retravaillé la section).
Voir également la section actuelle sur le même sujet dans le même article d'identifiant universel unique, Collisions .
la source
Si "donner suffisamment de temps" signifie 100 ans et que vous les créez à un rythme d'un milliard par seconde, alors oui, vous avez 50% de chances d'avoir une collision après 100 ans.
la source
Il existe plusieurs types d'UUID. Par conséquent, "la sécurité" dépend du type (que les spécifications de l'UUID appellent "version") que vous utilisez.
La version 1 est l'UUID basé sur le temps et l'adresse MAC. Les 128 bits contiennent 48 bits pour l'adresse MAC de la carte réseau (qui est uniquement attribuée par le fabricant) et une horloge de 60 bits avec une résolution de 100 nanosecondes. Cette horloge s'enroule dans 3603 AD afin que ces UUID soient en sécurité au moins jusque-là (à moins que vous n'ayez besoin de plus de 10 millions de nouveaux UUID par seconde ou que quelqu'un clone votre carte réseau). Je dis "au moins" parce que l'horloge commence au 15 octobre 1582, vous avez donc environ 400 ans après que l'horloge se termine avant qu'il y ait même une petite possibilité de duplication.
La version 4 est l'UUID à nombre aléatoire. Il y a six bits fixes et le reste de l'UUID est de 122 bits d'aléatoire. Voir Wikipédia ou une autre analyse décrivant la probabilité d'un doublon.
La version 3 utilise MD5 et la version 5 utilise SHA-1 pour créer ces 122 bits, au lieu d'un générateur de nombres aléatoire ou pseudo-aléatoire. Donc, en termes de sécurité, c'est comme si la version 4 était un problème statistique (tant que vous vous assurez que ce que l'algorithme de résumé traite est toujours unique).
La version 2 est similaire à la version 1, mais avec une horloge plus petite, elle se terminera beaucoup plus tôt. Mais comme les UUID de la version 2 sont pour DCE, vous ne devriez pas les utiliser.
Donc, pour tous les problèmes pratiques, ils sont sûrs. Si vous n'êtes pas à l'aise de le laisser aux probabilités (par exemple, vous êtes le type de personne inquiète de la destruction de la terre par un gros astéroïde au cours de votre vie), assurez-vous simplement d'utiliser un UUID version 1 et il est garanti d'être unique ( au cours de votre vie, sauf si vous prévoyez de vivre après 3603 après JC).
Alors pourquoi tout le monde n'utilise-t-il pas simplement les UUID de la version 1? En effet, les UUID de la version 1 révèlent l'adresse MAC de la machine sur laquelle ils ont été générés et ils peuvent être prévisibles - deux choses qui pourraient avoir des implications en termes de sécurité pour l'application utilisant ces UUID.
la source
La réponse à cela peut dépendre largement de la version de l'UUID.
De nombreux générateurs UUID utilisent un nombre aléatoire de la version 4. Cependant, beaucoup d'entre eux utilisent Pseudo un générateur de nombres aléatoires pour les générer.
Si un PRNG mal ensemencé avec une petite période est utilisé pour générer l'UUID, je dirais que ce n'est pas très sûr du tout.
Par conséquent, il n'est aussi sûr que les algorithmes utilisés pour le générer.
D'un autre côté, si vous connaissez la réponse à ces questions, je pense qu'un uuid de la version 4 devrait être très sûr à utiliser. En fait, je l'utilise pour identifier des blocs sur un système de fichiers de blocs réseau et jusqu'à présent, il n'y a pas eu de conflit.
Dans mon cas, le PRNG que j'utilise est un twister mersenne et je fais attention à la façon dont il est semé, qui provient de plusieurs sources, dont / dev / urandom. Mersenne twister a une période de 2 ^ 19937 - 1. Ça va être très très long avant de voir une répétition uuid.
la source
Citation de Wikipedia :
Il explique en détail assez bien à quel point il est sûr. Donc, pour répondre à votre question: oui, c'est assez sûr.
la source
Je suis d'accord avec les autres réponses. Les UUID sont suffisamment sûrs pour presque toutes les fins pratiques 1 , et certainement pour le vôtre.
Mais supposons (hypothétiquement) qu'ils ne le soient pas.
Voici quelques approches:
Utilisez un UUID plus grand. Par exemple, au lieu de 128 bits aléatoires, utilisez 256 ou 512 ou ... Chaque bit que vous ajoutez à un UUID de type 4 réduira de moitié la probabilité d'une collision, en supposant que vous avez une source fiable d'entropie 2 .
Créez un service centralisé ou distribué qui génère des UUID et enregistre chacun de ceux qu'il a jamais émis. Chaque fois qu'il en génère un nouveau, il vérifie que l'UUID n'a jamais été émis auparavant. Un tel service serait techniquement simple à mettre en œuvre (je pense) si nous supposions que les personnes qui géraient le service étaient absolument dignes de confiance, incorruptibles, etc. Malheureusement, ils ne le sont pas ... surtout lorsqu'il y a la possibilité que les organisations de sécurité des gouvernements interfèrent. Donc, cette approche est probablement impraticable, et peut-être 3 impossible dans le monde réel.
1 - Si l'unicité des UUID déterminait si des missiles nucléaires étaient lancés dans la capitale de votre pays, beaucoup de vos concitoyens ne seraient pas convaincus par "la probabilité est extrêmement faible". D'où ma qualification de "presque tous".
2 - Et voici une question philosophique pour vous. Quelque chose est-il vraiment vraiment aléatoire? Comment saurions-nous si ce n'était pas le cas? L'univers tel que nous le connaissons est-il une simulation? Y a-t-il un Dieu qui pourrait "modifier" les lois de la physique pour modifier un résultat?
3 - Si quelqu'un connaît des articles de recherche sur ce problème, veuillez commenter.
la source
Les schémas UUID utilisent généralement non seulement un élément pseudo-aléatoire, mais aussi l'heure actuelle du système et une sorte d'ID matériel souvent unique si disponible, comme une adresse MAC réseau.
L'intérêt de l'utilisation de l'UUID est que vous lui faites confiance pour mieux fournir un ID unique que vous ne pourriez le faire vous-même. C'est la même raison derrière l'utilisation d'une bibliothèque de cryptographie tierce plutôt que de rouler la vôtre. Le faire vous-même peut être plus amusant, mais c'est généralement moins responsable de le faire.
la source
Je le fais depuis des années. Ne rencontrez jamais de problème.
J'ai l'habitude de configurer mes bases de données pour avoir une table qui contient toutes les clés et les dates modifiées et autres. Je n'ai jamais rencontré de problème de clés en double.
Le seul inconvénient est que lorsque vous écrivez des requêtes pour trouver rapidement des informations, vous faites beaucoup de copier-coller des clés. Vous n'avez plus les identifiants courts et faciles à retenir.
la source
Voici un extrait de test pour tester ses uniquenes. inspiré par le commentaire de @ scalabl3
Si vous vous sentez chanceux, cochez la case, il ne vérifie que les identifiants actuellement générés. Si vous souhaitez une vérification de l'historique, ne la cochez pas. Veuillez noter que vous risquez de manquer de RAM à un moment donné si vous ne le cochez pas. J'ai essayé de le rendre convivial pour le processeur afin que vous puissiez abandonner rapidement en cas de besoin, appuyez simplement sur le bouton d'exécution de l'extrait de code ou quittez la page.
la source
Je ne sais pas si cela vous importe, mais gardez à l'esprit que les GUID sont globalement uniques, mais pas les sous-chaînes de GUID .
la source
Pour UUID4, je fais en sorte qu'il y ait à peu près autant de pièces d'identité qu'il y a de grains de sable dans une boîte en forme de cube avec des côtés de 360 000 km de long. C'est une boîte avec des côtés ~ 2 1/2 fois plus longs que le diamètre de Jupiter.
Travailler pour que quelqu'un puisse me dire si j'ai foiré des unités:
la source