Wie werden .NET 4 GUIDs generiert?

Ich bin mir der Vielzahl von Fragen hier ebenso bewusst wie Raymonds exzellenter (wie immer) Beitrag . Da der Algorithmus zum Erstellen von GUIDs jedoch anscheinend geändert wurde, war es für mich schwierig, aktuelle Informationen zu erhalten. Die MSDN scheint so wenig Informationen wie möglich zu liefern.

Was ist darüber bekannt, wie GUIDs in .NET 4 generiert werden? Was hat sich geändert und wie wirkt es sich auf die Sicherheit (“Zufälligkeit”) und Integrität (“Einzigartigkeit”) aus?

Ein spezifischer Aspekt, an dem ich interessiert bin: In V1 scheint es unmöglich zu sein, die gleiche GUID auf einer einzelnen Maschine wieder zu generieren, da ein Zeitstempel und ein Zähler beteiligt waren. In v4 ist dies nicht mehr der Fall (mir wurde gesagt), also die Chance, die gleiche GUID auf einer einzigen Maschine zu bekommen … erhöht ?

Seit Windows 2000 verwendet Microsoft einen Version 4-Algorithmus:

Mit Windows 2000 wechselte Microsoft zu GUIDs der Version 4, da das Einbetten der MAC-Adresse als Sicherheitsrisiko angesehen wurde. 1

Das können Sie auch anhand einer in .NET generierten GUID (aus Wikipedia ) sehen:

UUIDs der Version 4 haben die Form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx mit beliebigen hexadezimalen Ziffern für x, aber nur einer von 8, 9, A oder B für yeg f47ac10b-58cc-4372-a567-0e02b2c3d479.

Eine UUID der Version 4 besteht aus 122 signifikanten Bits, die 2 ^ 122 verschiedene Werte ergeben, was eine sehr große Zahl ist. Bei einer Reihe von H- Werten kann die erwartete Anzahl von Werten, die wir wählen müssen, bevor die erste zufällige Kollision mit einer 50% igen Chance gefunden wird, wie folgt berechnet werden (siehe Geburtstagsangriff auf Wikipedia):

Alt-Text

Das Ergebnis (Geburtstag gebunden) für 2 ^ 122 verschiedene Werte ist ungefähr 2,89e + 18. Dies setzt voraus, dass die generierten Werte zufällig verteilt sind. Wenn die Werte ungleich verteilt sind, kann eine zufällige Kollision schneller gefunden werden. Für weitere Details siehe auch Random UUID-Wahrscheinlichkeit von Duplikaten .

1 Tatsächlich konnte der Autor des Melissa-Wurms aufgrund einer GUID ausfindig gemacht werden, die mit einem Algorithmus der Version 1 erzeugt wurde.

Ja, es gab eine Änderung in .NET 4.0, Guid.NewGuid () ruft CoCreateGuid () , einen kleinen Wrapper um UuidCreate (), direkt auf. Frühere Versionen von .NET haben eine Hilfsfunktion in der CLR GuidNative :: CompleteGuid () aufgerufen. Welche CoCreateGuid aufruft. Nicht sicher, warum diese Änderung gemacht wurde, riecht nach nichts als einer kleinen Optimierung.

Auf jeden Fall erzeugt die exakt gleiche Windows-function die Guid, der Algorithmus war in den letzten 10 Jahren derselbe, er ist so zuverlässig wie eh und je.