2009-01-04 5 views
6

Ich schreibe gerade einen einfachen Passwort-Generator (C#). Dafür brauche ich ein paar Zufallszahlen.Wie zufällig ist System.Random in .NET 3?

Ist es in Ordnung, einfach die Random Klasse zu verwenden, die mit .NET geliefert wird, oder gibt es bekannte Probleme damit?

+0

Ein bisschen Thema, aber das ist eine alte gute Geschichte, wie falsch es gehen kann, wenn keine guten Zufallsgeneratoren haben .. http://www.cigital.com/papers/download/developer_gambling.php – StefanE

Antwort

13

Es ist nichts falsch daran - es ist gut genug, um einfache Passwörter zu generieren. Ein einfaches Beispiel (source):

Random RandomClass = new Random(); 
int RandomNumber = RandomClass.Next(); // Random number between 1 and 2147483647 
double RandomNumber = RandomClass.Next(1,10); // Random number between 1 and 10 

double RandomDouble = RandomClass.NextDouble(); // Random double between 0.0 and 1.0 

Der Artikel How To: Generate a Random Password (C#/VB.NET) hat ein sehr umfassendes Beispiel der Erzeugung gut, einfach zu lesen Passwörter mit bestimmten Komplexität. Es kann für Sie zu viel werden, aber es könnte eine gute Quelle sein, um Ideen zu kopieren.


Wenn Sie etwas mehr für Kryptographie benötigen, gibt es einen anderen Namespace für das:

System.Security.Cryptography 

Insbesondere Sie diese verwenden können:

System.Security.Cryptography.RNGCryptoServiceProvider.GetBytes(yourByte) 

Ein Beispiel ist Using Crypto for your Random Numbers in VB.NET und ein anderer ist Crypto Random Numbers.

Wenn Sie darüber nachdenken, Ihre eigenen zu rollen, hat die Seite Developer Guidance Share einige Informationen, um Sie davon zu reden.

+1

Verwenden von 'System.Random 'um Passwörter zu generieren ist nie in Ordnung. – CodesInChaos

1

Wenn Sie nach einigen Details sind, wie man System.Random für Sie arbeitet, ist dieser CodeBetter Artikel lesenswert. Er gibt einen guten Überblick darüber, was die Random-Funktion macht und wie man sie "zufälliger" macht, indem man eine Hash-GUID als Seed verwendet. Wenn Sie nur zufällige Initialkennwörter für Benutzerkonten generieren müssen (ich nehme hier an), dann sollte dies mehr als ausreichend sein, die Kryptografiewerkzeuge wären in diesem Fall wahrscheinlich übertrieben.

+1

@Glenn Slaven: das ist ein großartiger Artikel, aber es geht nicht darum, Syste.Random 'mehr zufällig' zu machen! Es geht darum, den Random-Konstruktor mit einer Zeitangabe aufzurufen, wenn nur wenig Zeit verstrichen ist (z. B. in einer engen Schleife). –

+2

Es gibt mehrere Computergeschichten über Programmierer, die dachten, sie könnten einen Zufallszahlengenerator "zufallsgenerierter" machen, indem sie das Ergebnis "stopfen" und seine Pseudozufälligkeit komplett durchbrechen. –

10

System.Random ist nicht als "kryptographisch starke" Quelle der Zufälligkeit. Die Ausgabe der Random-Funktion ist vollständig vorhersehbar, wenn der Angreifer den "Seed" -Wert kennt (oder erraten kann), der zum Erstellen des System.Random verwendet wurde. Wenn Sie einfach neu System.Random() aufrufen, ist dieser Anfangswert einfach eine Darstellung der aktuellen Systemzeit (etwas, das ein Angreifer oft sehr leicht erraten kann).

Auch wenn die Anfangszeit nicht genau bekannt ist, kann ein Angreifer alle potenziellen Werte in einem bestimmten Zeitraum durch Brute-Force überprüfen.

Die Zufallsgeneratoren im System.Security.Cryptography-Namespace sind für den Einsatz in einer solchen Situation konzipiert und erhalten ihre Unvorhersehbarkeit aus einer Reihe von viel sichereren Quellen.

0

Es gibt eine RFC für alles! - Randomness Requirements for Security (RFC 4086).

Sie können auch etwas Geld auf Hardware ausgeben, um einen zufälligen Seed zu erstellen. Ich denke ein Geiger counter ist der Standard für professionelle Lösungen. Die meisten Pokerseiten nutzen dies heutzutage.