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);

10voto

FacticiusVir Punkte 2017

Es ist keine vollständige Antwort, aber ich kann Ihnen sagen, dass die 13. Hexadezimalziffer immer 4 ist, weil sie die Version des Algorithmus angibt, der zur Generierung der GUID verwendet wird (d.h. v4); außerdem, und ich zitiere Wikipedia:

Kryptoanalyse der WinAPI-GUID Generators zeigt, dass, da die Folge von V4-GUIDs pseudozufällig ist, bei gegebenem Anfangszustand kann man bis zu den nächsten 250 000 GUIDs vorhersagen kann vorhersagen kann, die von der Funktion UuidCreate zurückgegeben werden. Aus diesem Grund sollten GUIDs nicht verwendet werden in der Kryptographie, z. B. als Zufallsschlüssel, verwendet werden.

Der Rest des Artikels und seine Referenzen: http://en.wikipedia.org/wiki/Guid

--Edit--

Vom Sicherheitsstandpunkt aus würde ich vorschlagen, dass Sie Ihre Sitzungs-ID nach Belieben generieren und dann kryptografisch signieren; auf diese Weise können Sie jede beliebige Information hineinpacken und dann einfach eine Signatur an das Ende anhängen - das mögliche Problem ist der Kompromiss zwischen der Größe/Stärke Ihres Schlüssels und der resultierenden Größe des Cookies. GUIDs sind als IDs nützlich, aber ich würde mich für die Sicherheit nur auf eine spezielle kryptographische Technik verlassen.

7voto

brianegge Punkte 28043

Ich schlage vor, Sie verwenden die System.Security.Cryptography.RandomNumberGenerator . Damit sollen Zahlen erzeugt werden, die nicht zurückentwickelt werden können. Die Motivation von Guid ist es, einzigartig zu sein. Man könnte sowohl die GUID als auch die sichere Zufallszahl kombinieren, aber eine sichere 128-Bit-Zufallszahl wird in der Praxis nie eine Kollision haben.

1voto

Lee Punkte 17973

Einige Anmerkungen:

  1. Ich bezweifle, dass irgendeine Implementierung von GUIDs so konzipiert wurde, dass sie kryptografisch sicher ist. (Und diese Vermutung wird durch den im nächsten Punkt verlinkten Artikel bestätigt).
  2. Das 13. ASCII-Zeichen ist ein Zeichen für welcher Algorithmus zur Erzeugung der GUID verwendet wurde .

Wenn Sie wirklich Wert auf starke Sitzungs-IDs legen, dann wäre vielleicht ein kryptografisch sicherer Hash von etwas, das nicht von außerhalb der Maschine ermittelt werden kann, der beste Ansatz. Vielleicht ist die Erzeugung eines Einwegpad aus einem internen Dokument oder einer Datenquelle funktionieren würde.

0voto

Noon Silk Punkte 52750

Was wollen Sie damit erreichen? Wollen Sie nur eine Quelle für Zufallszahlen?

Überprüfen Sie random.org y hotbits . Vor vielen, vielen Jahren hatte ich eine Java-Bibliothek, die Zahlen aus diesen Quellen sammelte und sie miteinander verband, um eine recht schöne Zufallsreihe zu erhalten (obwohl sie davon ausgeht, dass die beiden Seiten nicht in Cahootz sind).

-1voto

Alan Punkte 44139

Die kurze Antwort lautet: Nein, Guids sind nicht stark genug, um Sitzungs-IDs zu generieren, wenn man das Erraten und Knacken von Sitzungs-IDs verhindern will.

Aus demselben Grund, aus dem Sie eine GUID nicht als AES-Schlüssel verwenden möchten, sollten Sie sie auch nicht für sensible Identifizierungen jeglicher Art verwenden.

Eine GUID eignet sich sehr gut für die Zwecke, für die sie gedacht ist: Eine mathematisch garantierte, eindeutige ID, die sich nie wiederholt.

Selbst wenn das Knacken einer Sitzungs-ID nur 1000 Dollar wert ist, stellen Sie sich vor, dass dies 100 Mal geschieht. Jetzt geht es um viel Geld.

Ich weiß, dass es ein einfacher Ausweg ist, GUIDs zu verwenden, aber widerstehen Sie, und nehmen Sie den Schmerz in Kauf, indem Sie die richtigen Vorkehrungen treffen, um Ihre Anwendung angemessen zu sichern. Ihre Benutzer werden es Ihnen danken.

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