it-swarm-eu.dev

Sind GUIDs für einmalige Token sicher?

Ich sehe, dass viele Websites GUIDs zum Zurücksetzen von Passwörtern, zum Abbestellen von Anfragen und für andere Formen der eindeutigen Identifizierung verwenden.

Vermutlich sind sie ansprechend, weil sie einfach zu generieren, einzigartig, nicht sequentiell und zufällig erscheinen.

Aber sind sie für diese Zwecke sicher genug?

Es scheint mir, dass bei einer gegebenen GUID die Vorhersage nachfolgender GUIDs möglich sein kann, da sie (soweit ich weiß) nicht kryptografisch sicher sein sollen ... oder?

Hinweis:

  • Ich spreche nicht von Sites, die einen zufälligen Blob von Gobbledygook verwenden, der in base64 codiert ist.
  • Ich spreche von Websites wie diesen, die anscheinend eine rohe Richtlinie verwenden:
    http://example.com/forgotPassword/?id=b4684ce3-ca5b-477f-8f4d-e05884a83d3c
84
Michael Haren

Sind sie für die von Ihnen beschriebenen Zwecke sicher genug? Meiner Meinung nach im Allgemeinen ja. Sind sie in Anwendungen sicher genug, in denen die Sicherheit ein wichtiges Anliegen ist? Nein. Sie werden mit einem nicht zufälligen Algorithmus generiert, sodass sie in keiner Weise kryptografisch zufällig oder sicher sind.

Für eine Abmelde- oder Abonnementüberprüfungsfunktion sehe ich also wirklich kein Sicherheitsproblem. Um einen Benutzer einer Online-Banking-Anwendung zu identifizieren (oder wahrscheinlich sogar eine Funktion zum Zurücksetzen des Passworts einer Site, auf der Identität wertvoll ist), sind GUIDs definitiv unzureichend.

Weitere Informationen finden Sie unter Abschnitt 6 (Sicherheitsüberlegungen) des RFC 4122 für GUIDs (oder universell eindeutige Kennungen).

42
Xander

Die ID-Spezifikation beschreibt mehrere "Versionen", die Methoden zum Generieren der UUID sind. Die meisten zielen darauf ab, die Eindeutigkeit (das ist der Hauptpunkt der UUID) sicherzustellen, indem beispielsweise das aktuelle Datum verwendet wird. Dies ist effizient, bedeutet jedoch, dass die generierte UUID zwar eindeutig ist, aber auch vorhersehbar, was sie für einige Sicherheitsanwendungen unzureichend macht.

Die UUID-Generierungsmethode "Version 4" (in Abschnitt 4.4) soll jedoch einen kryptografisch starken Zufallszahlengenerator verwenden. 6 der 128 Bits sind auf einen herkömmlichen Wert festgelegt (um anzuzeigen, dass es sich nämlich um eine UUID der Version 4 handelt), sodass 122 Bits vom RNG übrig bleiben.

Wenn das zugrunde liegende RNG sicher ist (z. B. /dev/urandom Auf einem Linux/MacOS/* BSD-System oder CryptGenRandom() unter Windows) sollte ein Angreifer bei vielen generierten UUIDs nicht in der Lage sein, die nächste mit einer Erfolgswahrscheinlichkeit von mehr als 2 vorherzusagen-122, die für die meisten Zwecke ausreichend klein ist, einschließlich Startcodes für Atomraketen.

122 zufällige Bits stellen die Eindeutigkeit mit hoher Wahrscheinlichkeit sicher. Wenn Sie viele UUIDs der Version 4 generieren und akkumulieren, können Sie nach etwa 2 mit Ihrer ersten Kollision rechnen61 UUID - das sind ungefähr 2 Milliarden Milliarden; Das einfache Speichern dieser UUID-Anzahl würde mehr als 30 Millionen Terabyte verbrauchen. Wenn Sie "nur" 10 betrachten12 Bei einer solchen UUID (eintausend Milliarden, speicherbar über 16 Terabyte) beträgt das Risiko, zwei identische UUID unter diesen zu haben, etwa 9,4 * 10-14, d.h. ungefähr 700 Tausendmal weniger wahrscheinlich als Millionen von Dollar bei der Lotterie zu gewinnen.

Daher ist UUID are aus Sicherheitsgründen geeignet if (und nur wenn) es sich um UUID "Version 4" handelt, die mit einem sicheren RNG generiert wurde.

59
Thomas Pornin

Sie sind unter Windows 2000 oder neuer sicher. Ihre Sicherheitsanfälligkeit und Ihr Risiko hängen davon ab, wie die GUID generiert wird. Windows 2000 oder höher verwendet Version 4 der GUID), die kryptografisch sicher ist.

Weitere Informationen finden Sie unter dieser MSDN-Link und dieser Stapelüberlauffrage . (Danke an Jordan Rieger in den Kommentaren)

5

Wenn Sie eine gemeinsame Entwicklungssprache verwenden, ist das Erstellen eines One-Shot-Generators mit eindeutigen Zufallszahlen mithilfe einer geeigneten Kryptofunktion nicht so schwierig (es handelt sich um 10 Codezeilen, die als Beispiele in den gängigsten Sprachen einfach mit Google verfügbar sind ) und so ist es mit einem einfachen neuen Guid im Grunde genommen Faulheit aus Entwicklersicht.

In dem beschriebenen Szenario sind sie "sicher genug", wenn die in der Funktion "Passwort vergessen" übergebene Guid einige grundlegende Funktionen aufweist:

1) Es handelt sich wirklich um einen One-Shot-Wert, der keine Beziehung zur Benutzer-ID hat. Sobald das Kennwort zurückgesetzt wurde, kann es nicht mehr verwendet werden

2) Es hat ein definiertes Zeitfenster für seine Gültigkeit (Sie können das Passwort in den nächsten 30 Minuten zurücksetzen oder so ähnlich).

Wenn Sie dieselbe Guid verwenden, können Sie das Passwort mehrmals zurücksetzen oder die Guid und das Reset-Passwort von Benutzern erraten, die nicht nach einem Zurücksetzen des Passworts gefragt haben, oder, wie Avid im Kommentar beschreibt, versuchen, mit einer Art von Passwort auf das Zurücksetzen des Passworts zuzugreifen Replay Attach, dann ist das Anwendungsdesign fehlerhaft und die Verwendung oder Nichtverwendung eines Guid ist nicht das eigentliche Problem.

Wenn Sie also nicht mit sehr vertraulichen Informationen zu tun haben, könnte möglicherweise eine Anleitung funktionieren, aber warum sollten Sie die Dinge nicht beim ersten Mal richtig machen und eine richtige Krypto-API verwenden, um eine sichere zufällige Zeichenfolge zu generieren?

Grüße Massimo

3

Gefälschte "GUIDs", die nicht von einem GUID Generierungsalgorithmus) generiert werden, stattdessen aber einfach 128 Bit (16 Bytes) sind, die von einem kryptografisch sicheren PRNG generiert werden. und die lediglich mit herkömmlicher GUID Hex-with-Hyphens-Codierung) dargestellt werden, sind für einmalige Token meist sicher.

Sie stoßen jedoch auf das Geburtstagsproblem, da bei 128-Bit-Token eine Kollision von etwa 2 ^ -64 vorliegt.

Verwenden Sie besser 256-Bit- oder 512-Bit-Token, bei denen eine Kollision bei 2 ^ -128 oder 2 ^ -256 liegt.

0
yfeldblum