Frage

Wie sicher ist es UUID zu verwenden, um eindeutig etwas zu identifizieren (ich verwende es für Dateien auf den Server hochgeladen)? Wie ich es verstehe, ist es Zufallszahlen basiert. Allerdings scheint es mir, dass genug Zeit gegeben, würde es sie schließlich selbst wiederholen, nur durch reinen Zufall. Gibt es ein besseres System oder ein Muster von irgendeiner Art, dieses Problem zu lindern?

War es hilfreich?

Lösung

Sehr sicher:

  

das jährliche Risiko einer bestimmten Person, die von einem Meteoriten getroffen wird   Schätzungsweise eine Chance zu sein, in 17 Milliarden Euro, was bedeutet, dass die   Wahrscheinlichkeit ist etwa ,00000000006 (6 × 10 -11 ), was die Chancen   von ein paar Dutzend Billionen von UUIDs in einem Jahr zu schaffen und eine mit   Duplikat. Mit anderen Worten, nur nach dem Generieren 1 Milliarde UUIDs all   Sekunde für die nächsten 100 Jahre, ist die Wahrscheinlichkeit von nur einem zu schaffen   duplizieren würde etwa 50% sein.

Caveat:

  

Allerdings halten diese Wahrscheinlichkeiten nur, wenn die UUID erzeugt werden   mit ausreichender Entropie. Andernfalls wird die Wahrscheinlichkeit von Duplikaten   könnte sein könnte deutlich höher, da die statistische Streuung   niedriger sein. Wo eindeutige Kennungen für verteilte erforderlich   Anwendungen, so dass UUIDs nicht einmal kollidieren, wenn Daten aus vielen   Geräte verschmolzen werden verwendet, um die Zufälligkeit der Samen und Generatoren auf   Jedes Gerät muss für die Lebensdauer der Anwendung zuverlässig sein. Wo   dies nicht möglich ist, empfiehlt RFC4122 eine Namespace-Variante mit   statt.

Quelle: Random UUID Wahrscheinlichkeit von Duplikaten Abschnitt des Wikipedia-Artikels über Universell eindeutige Kennungen (Link vom Dezember 2016 zu einer Revision führt vor der Bearbeitung im Abschnitt überarbeitet).

Auch den aktuellen Abschnitt zum selben Thema auf dem gleichen Universell eindeutige Kennung Artikel sehen, Collisions .

Andere Tipps

Wenn von „genügend Zeit“ Sie 100 Jahre bedeuten und Sie sie mit einer Rate von einer Milliarde eines zweiten erstellen, dann ja, Sie haben eine Chance von 50%, eine Kollision nach 100 Jahren.

Es gibt mehr als eine Art von UUID, so „wie sicher“ hängt davon ab, welche Art (die die UUID Spezifikationen nennen „Version“) Sie verwenden.

  • Version 1 ist die Zeit, und MAC-Adresse UUID basiert. Der 128-Bit enthält 48 Bits für die MAC-Adresse der Netzwerkkarte und einen 60-Bit-Takt mit einer Auflösung von 100 Nanosekunden (die eindeutig durch den Hersteller zugeordnet ist). Das Takt in 3603 AD hüllt so sind diese UUIDs sicher zumindest bis dahin (es sei denn, Sie brauchen mehr als 10 Millionen neue UUIDs pro Sekunde oder jemand klont Ihre Netzwerkkarte). Ich sage „mindestens“, weil die Uhr beginnt am 15. Oktober 1582, so dass Sie etwa 400 Jahre, nachdem die Uhr wickelt, bevor es sogar eine kleine Möglichkeit, Vervielfältigungen ist.

  • Version 4 ist die Zufallszahl UUID. Es gibt sechs feste Bits und der Rest der UUID ist mit 122 Bits der Zufälligkeit. Siehe Wikipedia oder andere Analysen, die beschreiben, wie sehr unwahrscheinlich, dass ein Duplikat ist.

  • Version 3 verwendet MD5 und Version 5 verwendet SHA-1, diese 122-Bits zu erzeugen anstelle einem Zufalls- oder Pseudozufallszahlengenerator. So in Bezug auf die Sicherheit ist es wie Version 4 ein statistisches Problem zu sein (solange Sie sicherstellen, was die Digest-Algorithmus ist die Verarbeitung immer eindeutig ist).

  • Version 2 ist ähnlich wie Version 1, aber mit einer kleineren Uhr, so dass es geht um viel früher wickeln. Aber seit Version 2 UUIDs für DCE sind, sollten Sie diese nicht verwenden.

Also für alle praktischen Probleme sind sie sicher. Wenn Sie sich unwohl mit ihm bis zu Wahrscheinlichkeiten verlassen (zB Ihr sind die Art von Person besorgt über die Erde von einem großen Asteroiden in Ihrem Leben immer zerstört), so stellen Sie sicher, dass Sie eine Version 1 UUID verwenden, und es ist garantiert eindeutig sein ( in Ihrem leben planen, wenn Sie Vergangenheit 3603 AD leben).

Also, warum nicht jeder einfach Version 1 UUIDs verwenden? Das ist, weil Version 1 UUIDs die MAC-Adresse der Maschine zeigen, wurde erzeugt auf und sie können vorhersehbar sein -. Zwei Dinge, die Auswirkungen auf die Sicherheit für die Anwendung haben könnte diese UUIDs mit

Die Antwort auf diese kann weitgehend auf die UUID-Version ab.

Viele UUID-Generatoren verwenden, um eine Version 4 Zufallszahl. Allerdings verwenden viele dieser Pseudo einen Zufallszahlengenerator, um sie zu erzeugen.

Wenn ein schlecht geimpften PRNG mit einem kleinen Zeitraum verwendet wird, um die UUID zu erzeugen, würde ich sagen, es ist nicht sehr sicher überhaupt nicht.

Daher ist es nur so sicher wie die Algorithmen zu generieren verwendet.

Auf der anderen Seite, wenn Sie die Antwort auf diese Fragen wissen, dann denke ich, eine Version 4 UUID sollten sehr sicher zu bedienen. In der Tat ist es verwende ich Blöcke auf einem Netzwerkblock-Dateisystem zu identifizieren und bisher nicht einen Zusammenstoß hatte.

In meinem Fall die PRNG ich benutze ist eine Mersenne-Twister-und ich meine es vorsichtig mit der Art und Weise es ausgesät, die aus mehreren Quellen ist mit / dev / urandom. Mersenne-Twister hat eine Periode von 2 ^ 19937 -. 1. Es wird eine sehr, sehr lange Zeit dauern, bis ich eine Wiederholung Uuid siehe

Zitiert von Wikipedia :

  

So kann jemand eine UUID und Verwendung erstellen   es etwas zu identifizieren, mit   hinreichende Sicherheit, dass die   Kennung wird es nie sein   unbeabsichtigt von jedermann verwendet für   etwas anderes

Es geht ziemlich gut Detail zu erklären, wie sicher es tatsächlich ist. So Ihre Frage zu beantworten:. Ja, es ist sicher genug

UUID Systeme verwenden in der Regel nicht nur ein Pseudo-Zufallselement, sondern auch die aktuelle Systemzeit, und eine Art von oft eindeutiger Hardware-ID, falls vorhanden, wie ein Netzwerk MAC-Adresse.

Der vollständige Punkt UUID ist, dass Sie ihm vertrauen, einen besseren Job der Bereitstellung eine eindeutige ID, als Sie zu tun wäre, selbst in der Lage sein zu tun. Dies ist die gleiche Logik einer 3rd-Party-Kryptographie-Bibliothek hinter der Verwendung, anstatt Ihre eigenen Rollen. Doing it yourself kann mehr Spaß machen, aber es ist in der Regel weniger verantwortlich, dies zu tun.

es seit Jahren. Laufen Sie nie ein Problem.

ich in der Regel meine DB einrichten einen Tisch haben, die alle Schlüssel enthält und die geänderten Daten und so weiter. Haben Sie nicht schon einmal in ein Problem der doppelten Tasten ausgeführt werden.

Der einzige Nachteil, dass es hat, wenn Sie einige Abfragen schreiben einige Informationen schnell finden Sie eine Menge Kopieren und Einfügen des Schlüssels tun. Sie haben nicht die kurze leicht ids müssen mehr erinnern.

Hier ist ein Test-Snippet für Sie, es ist uniquenes zu testen. inspiriert von @ scalabl3 Kommentar

  

Das lustige daran ist, Sie 2 in einer Reihe erzeugen könnte, die identisch waren natürlich bei irrsinnig Ebenen der Zufall, Glück und göttliche Intervention, doch trotz der unergründlichen Widrigkeiten zum Trotz, ist es immer noch möglich! : D Ja, es wird nicht passieren. nur sagen, für die Unterhaltung zu diesem Moment zu denken, wenn Sie ein Duplikat erstellt! Screenshot Video! - scalabl3 20. Oktober '15 um 19:11 Uhr

Wenn Sie Glück, die Checkbox, überprüft er nur die zur Zeit der erzeugten ID. Wenn Sie eine Geschichte überprüfen möchten, lassen Sie es nicht aktiviert. Bitte beachten Sie, dass Sie vielleicht irgendwann aus dem RAM ausgeführt werden, wenn Sie es nicht aktivieren. Ich versuchte es CPU zu machen freundlich, so können Sie schnell abbrechen, wenn nötig, drücken Sie einfach die Lauf Schnipsel-Taste erneut oder die Seite verlassen.

Math.log2 = Math.log2 || function(n){ return Math.log(n) / Math.log(2); }
  Math.trueRandom = (function() {
  var crypt = window.crypto || window.msCrypto;

  if (crypt && crypt.getRandomValues) {
      // if we have a crypto library, use it
      var random = function(min, max) {
          var rval = 0;
          var range = max - min;
          if (range < 2) {
              return min;
          }

          var bits_needed = Math.ceil(Math.log2(range));
          if (bits_needed > 53) {
            throw new Exception("We cannot generate numbers larger than 53 bits.");
          }
          var bytes_needed = Math.ceil(bits_needed / 8);
          var mask = Math.pow(2, bits_needed) - 1;
          // 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111

          // Create byte array and fill with N random numbers
          var byteArray = new Uint8Array(bytes_needed);
          crypt.getRandomValues(byteArray);

          var p = (bytes_needed - 1) * 8;
          for(var i = 0; i < bytes_needed; i++ ) {
              rval += byteArray[i] * Math.pow(2, p);
              p -= 8;
          }

          // Use & to apply the mask and reduce the number of recursive lookups
          rval = rval & mask;

          if (rval >= range) {
              // Integer out of acceptable range
              return random(min, max);
          }
          // Return an integer that falls within the range
          return min + rval;
      }
      return function() {
          var r = random(0, 1000000000) / 1000000000;
          return r;
      };
  } else {
      // From http://baagoe.com/en/RandomMusings/javascript/
      // Johannes Baagøe <baagoe@baagoe.com>, 2010
      function Mash() {
          var n = 0xefc8249d;

          var mash = function(data) {
              data = data.toString();
              for (var i = 0; i < data.length; i++) {
                  n += data.charCodeAt(i);
                  var h = 0.02519603282416938 * n;
                  n = h >>> 0;
                  h -= n;
                  h *= n;
                  n = h >>> 0;
                  h -= n;
                  n += h * 0x100000000; // 2^32
              }
              return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
          };

          mash.version = 'Mash 0.9';
          return mash;
      }

      // From http://baagoe.com/en/RandomMusings/javascript/
      function Alea() {
          return (function(args) {
              // Johannes Baagøe <baagoe@baagoe.com>, 2010
              var s0 = 0;
              var s1 = 0;
              var s2 = 0;
              var c = 1;

              if (args.length == 0) {
                  args = [+new Date()];
              }
              var mash = Mash();
              s0 = mash(' ');
              s1 = mash(' ');
              s2 = mash(' ');

              for (var i = 0; i < args.length; i++) {
                  s0 -= mash(args[i]);
                  if (s0 < 0) {
                      s0 += 1;
                  }
                  s1 -= mash(args[i]);
                  if (s1 < 0) {
                      s1 += 1;
                  }
                  s2 -= mash(args[i]);
                  if (s2 < 0) {
                      s2 += 1;
                  }
              }
              mash = null;

              var random = function() {
                  var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
                  s0 = s1;
                  s1 = s2;
                  return s2 = t - (c = t | 0);
              };
              random.uint32 = function() {
                  return random() * 0x100000000; // 2^32
              };
              random.fract53 = function() {
                  return random() +
                      (random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
              };
              random.version = 'Alea 0.9';
              random.args = args;
              return random;

          }(Array.prototype.slice.call(arguments)));
      };
      return Alea();
  }
}());

Math.guid = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c)    {
      var r = Math.trueRandom() * 16 | 0,
          v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
  });
};
function logit(item1, item2) {
    console.log("Do "+item1+" and "+item2+" equal? "+(item1 == item2 ? "OMG! take a screenshot and you'll be epic on the world of cryptography, buy a lottery ticket now!":"No they do not. shame. no fame")+ ", runs: "+window.numberofRuns);
}
numberofRuns = 0;
function test() {
   window.numberofRuns++;
   var x = Math.guid();
   var y = Math.guid();
   var test = x == y || historyTest(x,y);

   logit(x,y);
   return test;

}
historyArr = [];
historyCount = 0;
function historyTest(item1, item2) {
    if(window.luckyDog) {
       return false;
    }
    for(var i = historyCount; i > -1; i--) {
        logit(item1,window.historyArr[i]);
        if(item1 == history[i]) {
            
            return true;
        }
        logit(item2,window.historyArr[i]);
        if(item2 == history[i]) {
            
            return true;
        }

    }
    window.historyArr.push(item1);
    window.historyArr.push(item2);
    window.historyCount+=2;
    return false;
}
luckyDog = false;
document.body.onload = function() {
document.getElementById('runit').onclick  = function() {
window.luckyDog = document.getElementById('lucky').checked;
var val = document.getElementById('input').value
if(val.trim() == '0') {
    var intervaltimer = window.setInterval(function() {
         var test = window.test();
         if(test) {
            window.clearInterval(intervaltimer);
         }
    },0);
}
else {
   var num = parseInt(val);
   if(num > 0) {
        var intervaltimer = window.setInterval(function() {
         var test = window.test();
         num--;
         if(num < 0 || test) {
    
         window.clearInterval(intervaltimer);
         }
    },0);
   }
}
};
};
Please input how often the calulation should run. set to 0 for forever. Check the checkbox if you feel lucky.<BR/>
<input type="text" value="0" id="input"><input type="checkbox" id="lucky"><button id="runit">Run</button><BR/>

Ich stimme mit den anderen Antworten. UUIDs sind sicher genug für nahezu alle praktischen Zwecke 1 , und für Ihr sicher.

Aber angenommen (hypothetisch), dass sie nicht sind.

  

Gibt es ein besseres System oder ein Muster von irgendeiner Art, dieses Problem zu lindern?

Hier sind ein paar Ansätze:

  1. Verwenden Sie einen größeren UUID. anstelle einer 128 Zufallsbits Zum Beispiel, verwenden Sie 256 oder 512 oder ... Jedes Bit Sie auf einen Typ-4-Stil UUID hinzufügen wird die Wahrscheinlichkeit einer Kollision durch eine Hälfte reduzieren, vorausgesetzt, dass Sie eine zuverlässige Quelle von Entropie < sup> 2 .

  2. Erstellen Sie einen zentralen oder Service verteilt, die UUID und zeichnet jede und jeden erzeugt sie jemals ausgegeben hat. Jedes Mal ist es eine neue generiert, überprüft er, dass die UUID noch nie zuvor ausgestellt worden. Ein solcher Dienst wäre technisch unkompliziert zu implementieren (glaube ich), wenn wir, dass die Leute absolut vertrauenswürdig, unbestechlich, und so weiter läuft der Dienst angenommen wurden. Leider sind sie nicht ... vor allem, wenn die Möglichkeit der Regierungen zu stören. So ist dieser Ansatz wahrscheinlich nicht praktikabel, und sein kann 3 unmöglich in der realen Welt.


1 - Wenn Einzigartigkeit von UUIDs bestimmt, ob Atomraketen auf Ihrem Land Hauptstadt ins Leben gerufen wurden, würden viele Ihre Mitbürger nicht davon überzeugt werden, „die Wahrscheinlichkeit äußerst gering“. Daher meine "fast alle" Qualifikation.

2 - Und hier ist eine philosophische Frage für Sie. Ist alles, was jemals wirklich zufällig? Wie würden wir wissen, ob es nicht ist? Ist das Universum, wie wir es eine Simulation wissen? Gibt es einen Gott, könnte möglicherweise die Gesetze der Physik „zwicken“ ein Ergebnis zu ändern?

3 -. Wenn jemand von Forschungsarbeiten zu diesem Problem kennt, bitte kommentieren

Ich weiß nicht, ob dies für Sie wichtig, aber bedenken Sie, dass a href = „http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx“ GUIDs ist weltweit einzigartig, aber Substrings von GUIDs nicht .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top