Ich beabsichtige, einen UNIQUEIDENTIFIER
als Zugriffsschlüssel zu verwenden, mit dem Benutzer auf bestimmte Daten zugreifen können. Der Schlüssel fungiert in diesem Sinne als Passwort.
Ich muss mehrere solcher Bezeichner als Teil einer INSERT...SELECT
Anweisung generieren . Aus architektonischen Gründen möchte ich in diesem Fall die Bezeichner serverseitig generieren.
Wie kann ich einen sicheren Zufall generieren UNIQUEIDENTIFIER
? Beachten Sie, dass NEWID
dies nicht zufällig ist, da es keinerlei Sicherheitseigenschaften verspricht. Ich suche nach dem SQL Server-Äquivalent von System.Security.Cryptography.RandomNumberGenerator, da ich nicht ermittelbare IDs benötige. Alles CHECKSUM
, was darauf basiert RAND
oder GETUTCDATE
sich auch nicht qualifizieren würde.
4
. Aber die Tatsache, dass ich keine eindeutigen Beweise dafür habe, dass sie erraten werden können, bedeutet nicht, dass sie es nicht sind. Ich kann diese Sicherheitsentscheidung nicht auf diese Beobachtung stützen.Antworten:
Sollte den Trick machen, hätte ich gedacht.
CRYPT_GEN_RANDOM
quelle
Nur meine zwei Cent, aber das ist vielleicht keine gute Idee. Um die exzellente Reihe von Eric Lippert über GUIDs ( Teil 1 , Teil 2 , Teil 3 ) zu paraphrasieren , lautet das Akronym GUID, nicht GSUID - Global Unique Identifier, nicht Global Secure Unique Identifier.
Das Problem liegt darin, dass bei der Generierung von GUIDs in einem nicht feindlichen Bereich, wie z. B. jedem, der NEWID () verwendet, garantiert wird, dass alle Werte eindeutig sind (siehe Eric's Artikel, Teil 3). Wenn eine feindliche Entität in diesen Bereich eintritt, kann sie sowohl die nächste generierte GUID vorhersagen als auch selbst Kollisionen verursachen.
Indem Sie Ihre eigene Methode zum Generieren eines Werts erstellen, den Sie in einer Struktur speichern, die wie eine GUID aussieht, sind Sie im Wesentlichen zu einer feindlichen Entität geworden. Sie haben den Vertrag einer GUID von eindeutig in zufällig geändert . Während jemand, der besser in Mathe ist als ich, wahrscheinlich beweisen kann, dass Sie immer noch einzigartig sind, liegt dies nur innerhalb der Grenzen Ihrer Erzeugungsmethode. Wenn Sie diese Pseudo-GUIDs mit NEWID () GUIDs mischen, sind alle Wetten deaktiviert.
Ich sage, dies ist möglicherweise keine gute Idee, nur weil ich nicht den gesamten Umfang Ihrer Verwendung der Werte kenne. Wenn Sie die einzige Entität sind, die die Werte generiert (kein Mix and Match), und / oder wenn Sie die Werte nicht beibehalten und / oder sich nicht für Kollisionen interessieren, ist dies möglicherweise kein Problem. Wenn eines dieser Elemente nicht zutrifft, sollten Sie es möglicherweise neu bewerten.
quelle
UNIQUEIDENTIFIER
ist meistens ein Zufall. Es ist einfach bequem, eine 16-Byte-Menge mit diesem Typ zu verarbeiten. Ich betrachte es als ein Passwort. Es muss jedoch einzigartig sein. Ich bin zuversichtlich, dass es nie zu einer Kollision kommen wird (und selbst wenn es eine gibt, stürzt die App einfach ab - das ist also auch sicher).Laut https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/ umschließt die NEWID () -Funktion nur die Windows-Funktion CoCreateGuid, die eine GUID im v4-Stil zurückgibt . Und laut https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11 seit Windows 2000 im Jahr 1999
Ich würde also sagen, Sie könnten NEWID () als kryptografisch sicher betrachten - zumindest im Ausmaß der 122 Entropiebits, die es bereitstellt.
quelle