Wie sicher unguessable GUIDs sind?
Vor einer Weile arbeitete ich auf einer web-Anwendung, in denen Benutzer tickets kaufen. Aufgrund der Art und Weise unserer client-Prozesse bearbeitet werden, was Sie effektiv haben als Ergebnis Ihrer Anschaffung war eine URL mit der ticket-Nummer in Ihr.
Wurden diese tickets zu kaufen Immobilien in den Nahen Osten, und jedes ticket wurde möglicherweise im Wert von rund $3,000,000. Klar dishing sequenziell ganze zahlen gewesen wäre, eine schlechte Idee. Wir verwendeten GUIDs wie Sie sind im Grunde unguessable, aber meine Frage ist: sind Sie sicher genug?
Wie ich es verstehe, werden die GUIDs .NET erzeugt, sind Total pseudo-zufällig (außer für ein paar nicht-unterschiedlicher bits). Allerdings, ich weiß nicht, welcher Algorithmus verwendet wird, diese zu generieren.
In der MSDN-Dokumentation sagt uns, dass Random
ist schnell und unsicher, und RNGCryptoServiceProvider
ist langsam und sicher. Das heißt, es ist vernünftig anzunehmen, jemand könnte in genügend Anstrengungen, um vorherzusagen, das Ergebnis Random
, aber nicht von RNGCryptoServiceProvider
.
Wenn Sie sahen, dass eine ausreichend lange Sequenz von GUIDs, wäre es möglich vorherzusagen, futures lieben? Wenn ja, wie viele würden Sie brauchen, zu sehen?
[In unserem Fall waren es physische Sicherheitskontrollen später - Sie hatte zu präsentieren, den Pass, die Sie verwendet, um Ihr ticket kaufen - so wäre es nicht gewesen zu schlimm, wenn jemand geraten hatte jemand anderes GUID, so dass wir nicht Schwitzen es an der Zeit. Die Bequemlichkeit der Verwendung der GUID, die als Datenbank-Schlüssel es eine nützliche Datentyp zu verwenden.]
Edit:
Also die Antwort "nicht genug".
Mit 0xA3's Antwort unten, und nach links von der Frage er im Zusammenhang mit dem folgenden code generieren einer kryptografisch zufälligen GUID, gültig von Abschnitt 4.4 der RFC 4122:
static Guid MakeCryptoGuid()
{
//Get 16 cryptographically random bytes
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] data = new byte[16];
rng.GetBytes(data);
//Mark it as a version 4 GUID
data[7] = (byte)((data[7] | (byte)0x40) & (byte)0x4f);
data[8] = (byte)((data[8] | (byte)0x80) & (byte)0xbf);
return new Guid(data);
}
Diese produziert GUIDs sehr viel langsamer als Guid.NewGuid()
, aber mit 122 bits der "ganz zufällige" Daten, sind Sie sicher unberechenbar.
Natürlich jede kryptografisch zufälligen text gemacht hätte, eine ticket-Nummer, aber GUIDs sind ziemlich praktisch. 🙂
Als mit der anderen version 4-GUIDs gibt es keine absolute Garantie der Einzigartigkeit, aber die Chancen sind beeindruckend. So lange, wie Sie weniger als 326,915,130,069,135,865 (d.h. sqrt(-2*2^122*ln(0.99))) GUIDs in gleichzeitig spielen, können Sie mehr als 99% sicher, es gibt keine Kollisionen. Anders ausgedrückt: wenn Sie wie die mine in Ihren Anwendungen overflow-Fehler alle über dem Platz, wenn Sie mehr als int.MaxValue
auch so ziemlich alles andere, Sie können mehr als 99.9999999999999999% sicher, dass keine Kollisionen (d.h. e^-(((2^31-1)^2)/(2*2^122))). Dies ist etwa tausend mal mehr sicher, als man sein kann, dass ein Meteorit wird nicht wischen Sie die meisten des Lebens auf der Erde innerhalb einer Sekunde von der Anwendung going live (d.h. einer pro 100 Millionen Jahre).
- Wenn so viel Geld auf dem Spiel steht, dann brauchen Sie jemanden die Schuld zu tragen, wenn die Lotterie ist gefährdet. Sie mieten einen security consultant.
- es ist ein web-service, der an einigen radiactive-element mit Detektor. er wandelt die Strahlung zu zahlen und Sie erhalten Sie. das ist das, was kann concidered zufällig. Schredinger genehmigt.
- Einfache Antwort: Eine GUID in .NET ist nicht wirklich eine UID, und schon gar nicht Global eindeutig ist. Es entspricht der v4 standard, aber man kann nicht wirklich nennen Sie diese UIDs, viel weniger Global eindeutige IDs. 6 bits sind fest von 128, hinterlässt eine zufällige Anzahl von Kapazität 2^122. Die random-Nummer ist nicht eindeutig, schon gar nicht weltweit einzigartig, und dessen Erzeugung ist nicht sicher, entweder. In anderen Worten: Es ist besser, Sie nicht zu verwenden, wenn Sie WIRKLICH besorgt mit Sicherheit.
- Sehen, eine gute Diskussion bei news.ycombinator.com/item?id=10631806 . In der Zusammenfassung, einige GUID/UUID-Generatoren sind kryptografisch sichere, und einige sind nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
UUIDs/GUIDs spezifiziert sind RFC4122. Obwohl die Version 4 UUIDs erstellt von Zufallszahlen Abschnitt 6 macht eine explizite Aussage über die Sicherheit:
Eine gute Diskussion über die Zufälligkeit von GUIDs finden Sie auch in dieser Frage:
Dies ist ein perfektes Beispiel dafür, wie nicht zu denken, eine Frage der Sicherheit. Leider ist es, wie ein Großteil der Entwickler Gedanken über die Sicherheit...
Nicht. Viele Ressourcen können eingebracht werden, auf ein problem, dass eine mögliche Auszahlung von $3M pro ticket. Diese Art von Geld könnte ziehen die Menschen mit vielen Ressourcen...einige sehr ernsthafte Menschen. Mit etwas, das stützt sich auf eine Allgemeine random number generator ist nicht sehr zufällig...also nicht sehr sicher. Es ist mehr der Verschleierung als der Kryptographie.
Wieder, mit diesem Betrag der cheddar auf der Strecke... ich kann Sie jedem Pass, die Sie wünschen.
Ja. Die Frage ist...Wie lange würde es dauern ? ...pro einige Verarbeitungseinheit arbeiten.
Hängt davon ab, was ich weiß, über Ihre Schöpfung...OS, CPU, etc...und ich bin mir sicher, dass ich finden kann, dass jemand in Ihrem Unternehmen, die daran interessiert wäre, in der information, im Austausch für, sagen wir...$100.000 oder, eher, weniger.
-- Dies kann alle scheinen ein wenig überdramatisch, aber Sie sprechen von einer ernst Menge Geld und es sollte geschützt werden, mit einer schweren Menge Sicherheit. Sie brauchen eine security-consulting-Firma, die Ihnen helfen können wählen Sie die Verschlüsselungs-Paket, das Sie kaufen für diese. Ihre Kunden sollten in der Lage sein zu helfen, über Ihre Risiko-management-Abteilung oder Ihrem Versicherer....Wenn nicht, erhalten Sie Ihren eigenen Anwalt...sollte man schon haben.
Natürlich, es gibt sehr wenig chance, dass etwas schief gehen würde mit dem GUID-Schema, aber wenn ging alles birnenförmig...Wie sind Sie gehen zu sagen, alle diejenigen Anwälte, die Ihre Sicherheit plan war erstklassig und sollten Sie woanders suchen ?...Vertrauen Sie mir, Sie wollen nicht zu hält die Tasche, wenn etwas schief geht. Das wäre wirklich schlecht für Sie.
Edit: Auf teedyay Kommentar...
Erlangung einer "Get Aus dem Gefängnis Frei" - Karte aus dem client ist immer eine gute Idee. Wenn Sie Ihnen sagen, "können Wir es sicher in dem Fall der trivialen Angriffe...aber sind wir nicht eine Sicherheit oder Kryptografie fest." dann ist Ihr job ist getan und der Kunde Links hält die Tasche.
GUID
s erzeugt von einem sehr bekannten Algorithmus. Es ist keine Zufälligkeit, built-in als bekannte Werte, wie Netzwerk-Karten-ID und Zeitstempel werden verwendet, um zu generieren.Sollten Sie nie verwendet werden, als ein Mittel der Sicherheit.
BEARBEITEN
Scheint es eine neuere version des
GUID/UUID
Algorithmus nicht mehr verwenden, eine hardware-Adresse, Teile Ihrer Werte und stattdessen pseudo-Zufallszahlen. Aber diese sind nicht wirklich zufällig und sollten nicht verwendet werden, für Sicherheits-kritische Anwendungen.