Wie sicher unguessable GUIDs sind?

Vor einer Weile arbeitete ich auf einer web-Anwendung, in denen Benutzer tickets kaufen. Aufgrund der Art und Weise unserer client-Prozesse bearbeitet werden, was Sie effektiv haben als Ergebnis Ihrer Anschaffung war eine URL mit der ticket-Nummer in Ihr.

Wurden diese tickets zu kaufen Immobilien in den Nahen Osten, und jedes ticket wurde möglicherweise im Wert von rund $3,000,000. Klar dishing sequenziell ganze zahlen gewesen wäre, eine schlechte Idee. Wir verwendeten GUIDs wie Sie sind im Grunde unguessable, aber meine Frage ist: sind Sie sicher genug?

Wie ich es verstehe, werden die GUIDs .NET erzeugt, sind Total pseudo-zufällig (außer für ein paar nicht-unterschiedlicher bits). Allerdings, ich weiß nicht, welcher Algorithmus verwendet wird, diese zu generieren.

In der MSDN-Dokumentation sagt uns, dass Random ist schnell und unsicher, und RNGCryptoServiceProvider ist langsam und sicher. Das heißt, es ist vernünftig anzunehmen, jemand könnte in genügend Anstrengungen, um vorherzusagen, das Ergebnis Random, aber nicht von RNGCryptoServiceProvider.

Wenn Sie sahen, dass eine ausreichend lange Sequenz von GUIDs, wäre es möglich vorherzusagen, futures lieben? Wenn ja, wie viele würden Sie brauchen, zu sehen?

[In unserem Fall waren es physische Sicherheitskontrollen später - Sie hatte zu präsentieren, den Pass, die Sie verwendet, um Ihr ticket kaufen - so wäre es nicht gewesen zu schlimm, wenn jemand geraten hatte jemand anderes GUID, so dass wir nicht Schwitzen es an der Zeit. Die Bequemlichkeit der Verwendung der GUID, die als Datenbank-Schlüssel es eine nützliche Datentyp zu verwenden.]


Edit:

Also die Antwort "nicht genug".

Mit 0xA3's Antwort unten, und nach links von der Frage er im Zusammenhang mit dem folgenden code generieren einer kryptografisch zufälligen GUID, gültig von Abschnitt 4.4 der RFC 4122:

static Guid MakeCryptoGuid()
{
    //Get 16 cryptographically random bytes
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] data = new byte[16];
    rng.GetBytes(data);

    //Mark it as a version 4 GUID
    data[7] = (byte)((data[7] | (byte)0x40) & (byte)0x4f);
    data[8] = (byte)((data[8] | (byte)0x80) & (byte)0xbf);

    return new Guid(data);
}

Diese produziert GUIDs sehr viel langsamer als Guid.NewGuid(), aber mit 122 bits der "ganz zufällige" Daten, sind Sie sicher unberechenbar.

Natürlich jede kryptografisch zufälligen text gemacht hätte, eine ticket-Nummer, aber GUIDs sind ziemlich praktisch. 🙂

Als mit der anderen version 4-GUIDs gibt es keine absolute Garantie der Einzigartigkeit, aber die Chancen sind beeindruckend. So lange, wie Sie weniger als 326,915,130,069,135,865 (d.h. sqrt(-2*2^122*ln(0.99))) GUIDs in gleichzeitig spielen, können Sie mehr als 99% sicher, es gibt keine Kollisionen. Anders ausgedrückt: wenn Sie wie die mine in Ihren Anwendungen overflow-Fehler alle über dem Platz, wenn Sie mehr als int.MaxValue auch so ziemlich alles andere, Sie können mehr als 99.9999999999999999% sicher, dass keine Kollisionen (d.h. e^-(((2^31-1)^2)/(2*2^122))). Dies ist etwa tausend mal mehr sicher, als man sein kann, dass ein Meteorit wird nicht wischen Sie die meisten des Lebens auf der Erde innerhalb einer Sekunde von der Anwendung going live (d.h. einer pro 100 Millionen Jahre).

  • Wenn so viel Geld auf dem Spiel steht, dann brauchen Sie jemanden die Schuld zu tragen, wenn die Lotterie ist gefährdet. Sie mieten einen security consultant.
  • es ist ein web-service, der an einigen radiactive-element mit Detektor. er wandelt die Strahlung zu zahlen und Sie erhalten Sie. das ist das, was kann concidered zufällig. Schredinger genehmigt.
  • Einfache Antwort: Eine GUID in .NET ist nicht wirklich eine UID, und schon gar nicht Global eindeutig ist. Es entspricht der v4 standard, aber man kann nicht wirklich nennen Sie diese UIDs, viel weniger Global eindeutige IDs. 6 bits sind fest von 128, hinterlässt eine zufällige Anzahl von Kapazität 2^122. Die random-Nummer ist nicht eindeutig, schon gar nicht weltweit einzigartig, und dessen Erzeugung ist nicht sicher, entweder. In anderen Worten: Es ist besser, Sie nicht zu verwenden, wenn Sie WIRKLICH besorgt mit Sicherheit.
  • Sehen, eine gute Diskussion bei news.ycombinator.com/item?id=10631806 . In der Zusammenfassung, einige GUID/UUID-Generatoren sind kryptografisch sichere, und einige sind nicht.
InformationsquelleAutor teedyay | 2010-09-06
Schreibe einen Kommentar