Wie sicher ist es, UUID zu verwenden, um etwas eindeutig zu identifizieren (ich verwende es für Dateien, die auf den Server hochgeladen wurden)? Soweit ich weiß, basiert es auf Zufallszahlen. Es scheint mir jedoch, dass es sich bei genügend Zeit irgendwann selbst wiederholen würde, nur durch Zufall. Gibt es ein besseres System oder ein Muster, um dieses Problem zu lösen?
guid
uniqueidentifier
uuid
Jason
quelle
quelle
Antworten:
Sehr sicher:
Vorbehalt:
Quelle: Der Abschnitt Zufällige UUID-Wahrscheinlichkeit von Duplikaten des Wikipedia-Artikels über universell eindeutige Bezeichner (Link führt zu einer Überarbeitung ab Dezember 2016, bevor der Abschnitt überarbeitet wurde).
Lesen Sie auch den aktuellen Abschnitt zum selben Thema im selben Artikel zur universell eindeutigen Kennung, Kollisionen .
quelle
Wenn Sie mit "genügend Zeit gegeben" 100 Jahre meinen und sie mit einer Rate von einer Milliarde pro Sekunde erstellen, dann haben Sie eine 50% ige Chance auf eine Kollision nach 100 Jahren.
quelle
Es gibt mehr als einen UUID-Typ. "Wie sicher" hängt also davon ab, welchen Typ (den die UUID-Spezifikationen als "Version" bezeichnen) Sie verwenden.
Version 1 ist die zeitbasierte UUID plus MAC-Adresse. Das 128-Bit enthält 48 Bit für die MAC-Adresse der Netzwerkkarte (die vom Hersteller eindeutig zugewiesen wird) und einen 60-Bit-Takt mit einer Auflösung von 100 Nanosekunden. Diese Uhr wird in 3603 AD umschlossen, sodass diese UUIDs zumindest bis dahin sicher sind (es sei denn, Sie benötigen mehr als 10 Millionen neue UUIDs pro Sekunde oder jemand klont Ihre Netzwerkkarte). Ich sage "zumindest", weil die Uhr am 15. Oktober 1582 beginnt. Sie haben also ungefähr 400 Jahre nach dem Umwickeln der Uhr Zeit, bevor es überhaupt eine kleine Möglichkeit von Duplikaten gibt.
Version 4 ist die Zufallszahlen-UUID. Es gibt sechs feste Bits und der Rest der UUID besteht aus 122 Bits Zufälligkeit. Siehe Wikipedia oder eine andere Analyse, die beschreibt, wie unwahrscheinlich ein Duplikat ist.
Version 3 verwendet MD5 und Version 5 verwendet SHA-1, um diese 122-Bit anstelle eines Zufalls- oder Pseudozufallszahlengenerators zu erstellen. In Bezug auf die Sicherheit ist Version 4 ein statistisches Problem (solange Sie sicherstellen, dass der Digest-Algorithmus immer eindeutig ist).
Version 2 ähnelt Version 1, hat jedoch eine kleinere Uhr, sodass sie sich viel früher dreht. Da UUIDs der Version 2 für DCE sind, sollten Sie diese nicht verwenden.
Für alle praktischen Probleme sind sie also sicher. Wenn es Ihnen unangenehm ist, es den Wahrscheinlichkeiten zu überlassen (z. B. wenn Sie sich Sorgen machen, dass die Erde in Ihrem Leben von einem großen Asteroiden zerstört wird), stellen Sie einfach sicher, dass Sie eine UUID der Version 1 verwenden, die garantiert eindeutig ist ( in Ihrem Leben, es sei denn, Sie planen, nach 3603 n. Chr. zu leben).
Warum verwendet nicht jeder einfach UUIDs der Version 1? Dies liegt daran, dass UUIDs der Version 1 die MAC-Adresse des Computers anzeigen, auf dem sie generiert wurden, und vorhersehbar sind - zwei Dinge, die Sicherheitsauswirkungen für die Anwendung haben können, die diese UUIDs verwendet.
quelle
Die Antwort darauf kann weitgehend von der UUID-Version abhängen.
Viele UUID-Generatoren verwenden eine Zufallszahl der Version 4. Viele von diesen verwenden jedoch Pseudo, einen Zufallszahlengenerator, um sie zu generieren.
Wenn ein schlecht gesätes PRNG mit einer kleinen Periode verwendet wird, um die UUID zu erzeugen, würde ich sagen, dass es überhaupt nicht sehr sicher ist.
Daher ist es nur so sicher wie die Algorithmen, mit denen es generiert wird.
Auf der anderen Seite, wenn Sie die Antwort auf diese Fragen kennen, sollte eine UUID der Version 4 meiner Meinung nach sehr sicher sein. Tatsächlich verwende ich es, um Blöcke in einem Netzwerkblock-Dateisystem zu identifizieren, und hatte bisher keinen Konflikt.
In meinem Fall ist das PRNG, das ich verwende, ein Mersenne-Twister, und ich bin vorsichtig mit der Art und Weise, wie es ausgesät wird, das aus mehreren Quellen stammt, einschließlich / dev / urandom. Mersenne Twister hat eine Periode von 2 ^ 19937 - 1. Es wird sehr, sehr lange dauern, bis ich eine Wiederholung sehe.
quelle
Zitat aus Wikipedia :
Es wird ziemlich ausführlich erklärt, wie sicher es tatsächlich ist. Um Ihre Frage zu beantworten: Ja, es ist sicher genug.
quelle
Ich stimme den anderen Antworten zu. UUIDs sind für nahezu alle praktischen Zwecke sicher genug 1 , und sicherlich für Ihre.
Aber nehmen wir (hypothetisch) an, dass dies nicht der Fall ist.
Hier sind einige Ansätze:
Verwenden Sie eine größere UUID. Verwenden Sie beispielsweise anstelle von 128 zufälligen Bits 256 oder 512 oder ... Jedes Bit, das Sie einer UUID vom Typ 4 hinzufügen, verringert die Wahrscheinlichkeit einer Kollision um die Hälfte, vorausgesetzt, Sie haben eine zuverlässige Entropiequelle 2 .
Erstellen Sie einen zentralisierten oder verteilten Dienst, der UUIDs generiert und jeden einzelnen Dienst aufzeichnet, den er jemals ausgegeben hat. Jedes Mal, wenn eine neue generiert wird, wird überprüft, ob die UUID noch nie zuvor ausgestellt wurde. Die Implementierung eines solchen Dienstes wäre technisch unkompliziert (glaube ich), wenn wir davon ausgehen würden, dass die Personen, die den Dienst ausführen, absolut vertrauenswürdig, unbestechlich usw. sind. Leider sind sie nicht ... besonders wenn die Möglichkeit besteht, dass sich die Sicherheitsorganisationen der Regierungen einmischen. So ist dieser Ansatz wahrscheinlich nicht praktikabel, und seine 3 unmöglich in der realen Welt.
1 - Wenn die Einzigartigkeit der UUIDs bestimmen würde, ob in der Hauptstadt Ihres Landes Atomraketen abgefeuert wurden, wären viele Ihrer Mitbürger nicht davon überzeugt, dass "die Wahrscheinlichkeit extrem gering ist". Daher meine "fast alle" Qualifikation.
2 - Und hier ist eine philosophische Frage für Sie. Ist irgendetwas jemals wirklich zufällig? Wie würden wir wissen, wenn es nicht wäre? Ist das Universum, wie wir es kennen, eine Simulation? Gibt es einen Gott, der möglicherweise die Gesetze der Physik "zwickt", um ein Ergebnis zu ändern?
3 - Wenn jemand Forschungsarbeiten zu diesem Problem kennt, kommentieren Sie diese bitte.
quelle
UUID-Schemata verwenden im Allgemeinen nicht nur ein pseudozufälliges Element, sondern auch die aktuelle Systemzeit und eine häufig eindeutige Hardware-ID, falls verfügbar, z. B. eine Netzwerk-MAC-Adresse.
Der springende Punkt bei der Verwendung von UUID ist, dass Sie darauf vertrauen, dass es eine eindeutige ID besser bereitstellt, als Sie es selbst könnten. Dies ist das gleiche Grundprinzip für die Verwendung einer Kryptografie-Bibliothek eines Drittanbieters, anstatt Ihre eigene zu rollen. Es macht vielleicht mehr Spaß, es selbst zu tun, aber es ist normalerweise weniger verantwortlich, dies zu tun.
quelle
Ich mache es schon seit Jahren. Niemals auf ein Problem stoßen.
Normalerweise richte ich meine DBs so ein, dass sie eine Tabelle haben, die alle Schlüssel und die geänderten Daten und dergleichen enthält. Ich bin noch nie auf ein Problem mit doppelten Schlüsseln gestoßen.
Der einzige Nachteil ist, dass Sie beim Schreiben einiger Abfragen, um schnell nach Informationen zu suchen, viel kopieren und einfügen müssen. Sie haben nicht mehr die kurzen, leicht zu merkenden Ausweise.
quelle
Hier ist ein Test-Snippet, mit dem Sie die Einzigartigkeit testen können. inspiriert von @ scalabl3s Kommentar
Wenn Sie Glück haben, aktivieren Sie das Kontrollkästchen. Es werden nur die aktuell generierten IDs aktiviert. Wenn Sie eine Verlaufsprüfung wünschen, lassen Sie diese deaktiviert. Bitte beachten Sie, dass Ihnen möglicherweise irgendwann der RAM ausgeht, wenn Sie das Kontrollkästchen nicht aktivieren. Ich habe versucht, es CPU-freundlich zu machen, damit Sie bei Bedarf schnell abbrechen können. Drücken Sie einfach erneut auf die Schaltfläche "Snippet ausführen" oder verlassen Sie die Seite.
quelle
Ich weiß nicht, ob dies für Sie wichtig ist, aber denken Sie daran, dass GUIDs global eindeutig sind, Teilzeichenfolgen von GUIDs jedoch nicht .
quelle
Für UUID4 stelle ich fest, dass es ungefähr so viele IDs gibt wie Sandkörner in einer würfelförmigen Box mit Seiten mit einer Länge von 360.000 km. Das ist eine Schachtel mit Seiten, die ~ 2 1/2 mal länger sind als Jupiters Durchmesser.
Arbeiten, damit mir jemand sagen kann, ob ich Einheiten durcheinander gebracht habe:
quelle