2016-06-28 6 views
0

ich mit diesem Code eine Anti-CSRF-Token bin zu erzeugen:Ist das Guid zufällig oder erratbar

TokenCSRF = new Random(Guid.NewGuid().GetHashCode()).Next(1, 9999).ToString(); 

Ist das Token zu erraten oder wirklich zufällig, wie erwartet?

Edit: ersetzen ich den Token-Generator mit diesem:

byte[] byt = new byte[sizeof(Int32)]; 
    RNGCryptoServiceProvider rngCrypto = new RNGCryptoServiceProvider(); 

    rngCrypto.GetBytes(byt); 

    return BitConverter.ToInt32(byt, 0); 

Dank.

+3

warum nicht nur 'Guid.NewGuid()'? – Rahul

+4

Wer sagt, Guid's * garantiert * zufällig zu sein? Guids sind Quelle der Einzigartigkeit, nicht Zufälligkeit. Verwenden Sie eine geeignete Zufallsquelle für etwas, das zufällig sein sollte. –

+0

Weil eine Zahl zwischen 1 und 10.000 gut genug ist; könnte es auch zwischen 1 und 100K oder einer Million machen. – frenchie

Antwort

6

Ist dieses Token erwartungsgemäß oder wirklich zufällig?

Das ist die falsche Frage zu stellen.

Mike Zs Kommentar ist korrekt. Guids sind garantiert einzigartig, nicht zufällig. Es gibt verschiedene Guid-Generation-Techniken, und einige von ihnen sind zufälliger als andere. Insbesondere kann ein GUID-Generator sequentielle GUIDs erzeugen. Die meisten nicht, aber Wenn Sie eine Guid für etwas anderes als Einzigartigkeit verwenden, verwenden Sie es Off-Label. Ich mag es nicht irgendetwas Off-Label zu tun, wenn die Sicherheit auf der Linie ist.

Insbesondere haben wir keinen Beweis dafür, dass ein Sicherheitsexperte den Code entweder im GUID-Generator oder im Hash-Generator überprüft hat, um sicherzustellen, dass er über ausreichende Entropie verfügt, um einen Angreifer zu besiegen. Sie sollten Ihre Sicherheit auf Tools basieren, die von Experten überprüft wurden.

Während wir dabei sind: Der Code selbst ist bizarr. Es nimmt an, dass der Hash einer GUID eine ausreichende Entropie hat, um einen Zufallszahlengenerator zu erzeugen, und dann generieren Sie aus diesem RNG eine einzelne 5-stellige Dezimalzahl. Durch Annahme haben Sie bereits eine 32-Bit-Zufallszahl in der Hand; Warum nimmst du es nicht als Zufallszahl, wenn es bereits eine Quelle der Zufälligkeit ist, die gut genug ist, um ein Samen zu sein? Sie haben einen zufälligen Startwert, der mehr als groß genug ist, um die von Ihnen gesuchte Zufallszahl zu sein! Feeding es in Random wird es nicht machen mehr zufällig.

Das gesagt, Sie sollten es überhaupt nicht verwenden.

Die richtige Frage ist:

Was ist der richtige Weg ist, eine Zufallszahl für einen Sicherheitszweck zu generieren?

Verwenden Sie einen Crypto-Stärke-Zufallsgenerator, dessen On-Label-Verwendung genau das ist. In der .NET-Laufzeitbibliothek ist eine verfügbar. benutze es!

Weiterführende Literatur:

https://blogs.msdn.microsoft.com/ericlippert/tag/guids/

Teil 3 ist insbesondere relevant für Ihre Frage.

+0

Ok, ich werde in die Crypto-Klasse. – frenchie

+0

Was ist, wenn das Ziel darin besteht, eine Zahl zu erzeugen, die sowohl zufällig als auch eindeutig ist? – devuxer

+0

@devuxer: Beginnen Sie damit, "einzigartig" * sehr * sorgfältig zu definieren. Eine GUID Typ 4 ist beispielsweise * statistisch * eindeutig. Wenn wir einen Computer hätten, der zufällig GUIDs erzeugt, dann würden wir eine Kollision mit einer bestimmten Guid in etwa 30 Billionen Jahren erwarten. Ist das die Art von Einzigartigkeit, die Ihnen wichtig ist? Wenn wir jeden Computer auf der Welt hätten, der Leitfäden erzeugt und zwei zusammenstoßen könnten, würden wir eine Kollision in ungefähr einer Stunde erwarten. Ist das die Art von Einzigartigkeit, die Ihnen wichtig ist? –

1

GUID ist wahrscheinlich, weil ein Teil davon von der Maschine identifiziert wird, auf der er generiert wird, und Teil ist der Zeitstempel. Es ist nichts besseres als stattdessen den aktuellen Zeitstempel zu säen, was wiederum erraten werden kann.

Wenn Sie sichere Token generieren möchten, können Sie die System.Security.Cryptography.RNGCryptoServiceProvider-Klasse oder eine ähnliche Methode verwenden.

In einem verwandten Hinweis, beschränken Sie Ihre Tokens nicht auf 10K-Werte oder so klein. Sie würden sich für Brute-Force-Angriffe öffnen. Verwenden Sie etwas wie mindestens 64-Bit und dann werden Sie sicher sein. Wenn Sie sich auf kryptografische Zufallszahlen stützen, möchten Sie möglicherweise 8 oder 16 Byte generieren und diese dann in eine Zeichenfolge mit Basis-64-Codierung umwandeln. Das klingt ziemlich sicher für mich.

+0

Eine GUID besteht * nicht * garantiert aus der Maschinenadresse und der aktuellen Uhrzeit; Das ist eine Art 1 Guid. Guids, die von NewGuid generiert werden, sind in der Praxis zufällige Typ 4-Guids. Aber Sie sollten sich aus Sicherheitsgründen nicht auf diese Tatsache verlassen. Es gibt keine Garantie dafür, dass der Guid-Generator von Sicherheitsexperten geprüft wurde, um für diesen Zweck geeignet zu sein. –

+0

Das stimmt, danke. –

+0

Eigentlich ist es ein Token, das für Ajax-Anfragen verwendet wird und jede Anfrage gibt ein neues Token aus, so dass das Token nur für eine Anfrage gültig ist. – frenchie

Verwandte Themen