Насколько случайным является System.Random в .NET 3? - PullRequest
6 голосов
/ 05 января 2009

Я сейчас пишу простой генератор паролей (C #). Для этого мне нужно несколько случайных чисел.

Можно ли просто использовать класс Random , который поставляется с .NET, или есть какие-либо известные проблемы с этим?

Ответы [ 4 ]

13 голосов
/ 05 января 2009

В этом нет ничего плохого - этого достаточно, чтобы генерировать простые пароли. Простой пример ( 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

Статья Как: создать случайный пароль (C # / VB.NET) содержит очень полный пример создания хороших, легко читаемых паролей с заданной сложностью. Это может быть излишним для вас, но может стать хорошим источником для копирования идей.


Если вам нужно что-то еще для криптографии, для этого есть другое пространство имен:

System.Security.Cryptography

В частности, вы можете использовать это:

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

Примером является Использование Crypto для ваших случайных чисел в VB.NET , а другим является Crypto Random Numbers .

Если вы подумываете о том, чтобы сделать что-то свое, на сайте Share Руководства для разработчиков есть некоторая информация, чтобы отговорить вас.

10 голосов
/ 05 января 2009

System.Random - это , а не как «криптографически сильный» источник случайности. Вывод функции Random полностью предсказуем, если злоумышленник знает (или может догадаться) «начальное» значение, которое использовалось для создания System.Random. Если вы просто вызываете new System.Random (), то это начальное значение представляет собой просто представление текущего системного времени (то, что злоумышленник может очень легко угадать).

Даже если начальное время точно не известно, злоумышленник может проверить все потенциальные значения в заданном временном диапазоне грубой силой.

Генераторы случайных чисел в пространстве имен System.Security.Cryptography предназначены для использования в подобных ситуациях и приобретают непредсказуемость из ряда гораздо более безопасных источников.

1 голос
/ 05 января 2009

Если вам нужны подробности о том, как заставить System.Random работать на вас, эту статью CodeBetter стоит прочитать. Он дает хороший обзор того, что делает функция Random и как сделать ее «более случайной», используя хешированный GUID в качестве начального числа. Если вам просто нужно сгенерировать случайные начальные пароли для учетных записей пользователей (я предполагаю, что здесь), то этого должно быть более чем достаточно, инструменты криптографии в этом случае, вероятно, будут излишними.

0 голосов
/ 06 января 2011

Существует RFC для всего! - Требования случайности для безопасности (RFC 4086).

Вы также можете потратить несколько долларов на оборудование, чтобы создать случайное начальное число. Я думаю, что счетчик Гейгера является стандартом для профессиональных решений. В настоящее время большинство покерных сайтов использует это.

...