Wie sicher sind GUIDs nicht zu erraten?

or einiger Zeit arbeitete ich an einer Webanwendung, mit der Benutzer Tickets kaufen konnten. Aufgrund der Art und Weise, wie die Prozesse unserer Kunden funktionierten, erhielten Sie als Ergebnis Ihres Einkaufs eine URL mit der darin enthaltenen Ticketnummer.

Dies waren Tickets für den Kauf von Immobilien im Nahen Osten, und jedes Ticket hatte einen Wert von etwa 3.000.000 USD. Es wäre eine schlechte Idee gewesen, sequentielle Ganzzahlen eindeutig auszusortieren. Wir haben GUIDs verwendet, da sie im Grunde genommen nicht zu erraten sind, aber meine Frage ist: Sind sie sicher genug?

Wie ich es verstehe, sind die GUIDs, die .NET erzeugt, völlig pseudozufällig (mit Ausnahme einiger nicht variierender Bits). Ich weiß jedoch nicht, mit welchem Algorithmus sie generiert werden.

Die MSDN-Dokumentation sagt uns, dassRandom ist schnell und unsicher undRNGCryptoServiceProvider ist langsam und sicher. Das heißt, es ist vernünftig anzunehmen, dass jemand genügend Anstrengungen unternehmen könnte, um das Ergebnis von @ vorherzusageRandom, aber nicht vonRNGCryptoServiceProvider.

Wenn Sie eine ausreichend lange Folge von GUIDs gesehen haben, können Sie dann zukünftige voraussagen? Wenn ja, wie viele müssten Sie sehen?

[In unserem speziellen Fall gab es später physische Sicherheitskontrollen - Sie mussten den Pass vorlegen, mit dem Sie Ihr Ticket gekauft haben - es wäre also nichtauc schlecht, wenn jemand die GUID eines anderen erraten hätte, also haben wir es damals nicht geschwitzt. Die bequeme Verwendung der GUID als Datenbankschlüssel machte sie zu einem nützlichen Datentyp.]

Bearbeiten

So ist die Antwort "nicht genug".

Using 0xA3 's Antwort unten und folgende Links aus demFragenn er mit verknüpft ist, generiert der folgende Code eine kryptografisch zufällige GUID, die von @ gültig isAbschnitt 4.4 von 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);
}

Dies erzeugt GUIDs viel langsamer alsGuid.NewGuid(), aber mit 122 Bits "sehr zufälliger" Daten sind sie sicher nicht vorhersehbar.

Natürlich hätte jeder kryptografisch zufällige Text für eine Ticketnummer getan, aber GUIDs sind ziemlich praktisch. : -)

Wie bei anderen GUIDs der Version 4 gibt es keine absolute Garantie für die Eindeutigkeit, aber die Chancen sind beeindruckend. Solange Sie weniger als 326.915.130.069.135.865 (d. H.sqrt (-2 * 2 ^ 122 * ln (0.99))) GUIDs gleichzeitig spielen, können Sie mehr als 99% sicher sein, dass es keine Kollisionen gibt. Anders ausgedrückt: Wenn Ihre Anwendung wie meine überall Überlauffehler aufweist, wenn Sie mehr als @ habint.MaxValue von so ziemlich allem können Sie mehr als 99.9999999999999999% sicher sein, dass keine Kollisionen vorliegen (d. h.e ^ - (((2 ^ 31-1) ^ 2) / (2 * 2 ^ 122))). Dies ist ungefähr tausendmal so sicher, dass ein Meteorit nicht innerhalb einer Sekunde nach dem Start der Anwendung den größten Teil des Lebens auf der Erde vernichtet (d. H.in Mensch pro 100 Millionen Jah).

Antworten auf die Frage(6)

Ihre Antwort auf die Frage