13 Stimmen

Wie deterministisch sind .Net-GUIDs?

Gestern habe ich gefragt Sind GUIDs, die unter Windows 2003 generiert wurden, sicher als Sitzungs-IDs zu verwenden? und die Antwort in Verbindung mit diesem Artikel GUIDs sind global eindeutig, aber Teilstrings von GUIDs sind es nicht. hat mich dazu veranlasst, darüber nachzudenken, meinen derzeitigen Mechanismus der Verwendung von GUIDs als Sitzungs-IDs in Cookies zu ersetzen.

Da es ein bisschen Arbeit ist, diese Änderung vorzunehmen, beschloss ich, einen schnellen GUID-Test auf meinem Vista-PC durchzuführen, um zu sehen, ob eine Sequenz von GUIDs offensichtlich deterministisch ist (was mich beunruhigt, ist, dass ein Angreifer in der Lage war, eine Sequenz von GUIDs zu erhalten, die von meinem Server generiert wurden, und dass er in der Lage sein würde, neue passende GUIDs zu generieren).

In dem Artikel von Raymond Chen (der sich auf diese sehr alte Spezifikation bezieht UUIDs und GUIDs aus dem Jahr 1998) setzt sich die GUID zusammen:

  • 60 Bits des Zeitstempels,
  • 48 Bits der Computer-Kennung,
  • 14 Bits der eindeutigen Kennung und
  • sechs Bits sind festgelegt

Wenn ich 10 GUIDs generiere, sind die ersten 15 ASCII-Zeichen (außer '-') der Zeitstempel, die nächsten 12 ASCII-Zeichen sind die Computerkennung, die nächsten 3,5 ASCII-Zeichen sind zufällig und die letzten 1,5 Zeichen sind fest.

Erhalten 10 GUIDs auf meinem Vista PC mit der .Net System.Guid.NewGuid() ergibt:

b4e95ead-3619-4dc2-9102-cf7ab0efd927
a45ee719-decd-46b2-8355-7becbe406f74
9af68d75-35a0-4907-b6ab-f15e33acfe96
bed88fa3-3209-4a19-97dd-85d5428ea5f4
123cb39b-8d81-41c6-8894-f1257a8f7606
e2b1f6b1-5791-4a18-80a9-5dc668574ecb
c52aa660-2629-4659-bb83-5583081e5a1c
76eda32d-ceda-412e-8ade-30c47416e954
cbc4d45e-7281-40d2-9f90-00539b04fe98
be36524c-267c-4791-bc9e-3c20b29d7615

Das einzige Muster, das bei einer schnellen visuellen Inspektion erkennbar ist, ist, dass das 13. ASCII-Zeichen immer 4 ist.

Ich frage mich erneut, ob die Verwendung von System.Guid zur Generierung pseudozufälliger Sitzungs-IDs stark genug ist, um eine Webanwendung zu schützen, bei der das Knacken einer Sitzungs-ID höchstens Tausende von Dollar wert wäre?

Update: Anstatt eine GUID zu verwenden, plane ich jetzt, meine Sitzungs-IDs mit dem folgenden Ansatz zu generieren. Ich konvertiere die 384-Bit-Zufallszahl in eine 0x00-Byte-Zeichenkette, damit sie für die Verwendung in einem HTTP-Cookie geeignet ist.

RNGCryptoServiceProvider rngProvider = new RNGCryptoServiceProvider();
byte[] myKey = new byte[48];
rngProvider.GetBytes(myKey);
string sessionID = null;
myKey.ToList().ForEach(b => sessionID += b.ToString("x2"));
Console.WriteLine(sessionID);

-1voto

user161433 Punkte 4251

In Anbetracht der Möglichkeiten ist es fast unmöglich, ein Duplikat des Führerscheins zu erhalten. Hier sind einige schnelle mathematische Fakten

Sandkörner auf der Welt 75.000.000.000.000.000.000

Anzahl der GUIDs 340.282.366.920.938.463.463.374.607.431.770.000.000

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X