




В этом нет ничего плохого - он достаточно хорош для генерации простых паролей. Простой пример (источник):
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)
Примером является Использование криптографии для случайных чисел в VB.NET, а другим - Крипто случайные числа.
Если вы подумываете о выпуске своего собственного, на сайте Поделиться руководством разработчика есть информация, которая отговорит вас от этого.
Никогда не использовать System.Random для генерации паролей.
Если вам нужны некоторые подробности о том, как заставить System.Random работать на вас, эту статью CodeBetter стоит прочитать. Он дает хороший обзор того, что делает функция Random и как сделать ее «более случайной», используя хешированный GUID в качестве начального числа. Если вам просто нужно сгенерировать случайные начальные пароли для учетных записей пользователей (я предполагаю здесь), этого должно быть более чем достаточно, инструменты криптографии, вероятно, в этом случае будут излишними.
@Glenn Slaven: это отличная статья, но она не о том, чтобы сделать Syste.Random более случайным! Речь идет о решении вызова конструктора Random с начальным значением времени, когда прошло очень мало времени (например, в жестком цикле).
Есть несколько компьютерных историй о программистах, которые думали, что могут сделать генератор случайных чисел «более случайным», сделав «кое-что» с результатом и полностью нарушив его псевдослучайность.
System.Random - это нет как «криптографически стойкий» источник случайности. Вывод функции Random полностью предсказуем, если злоумышленник знает (или может угадать) «начальное» значение, которое использовалось для создания System.Random. Если вы просто вызываете new System.Random (), это начальное значение является просто представлением текущего системного времени (то, что злоумышленник может легко угадать).
Даже если начальное время точно не известно, злоумышленник может проверить все потенциальные значения в заданном временном диапазоне с помощью грубой силы.
Генераторы случайных чисел в пространстве имен System.Security.Cryptography предназначены для использования в подобных ситуациях и получают свою непредсказуемость из ряда гораздо более безопасных источников.
Для всего есть RFC! - Требования к случайности для безопасности (RFC 4086).
Вы также можете потратить большие деньги на оборудование, чтобы создать случайное начальное число. Я думаю, что счетчик Гейгера - это стандарт профессиональных решений. В настоящее время это используется большинством покерных сайтов.
Немного по теме, но это старая хорошая история, как все может пойти не так, если у вас нет хороших генераторов случайных чисел .. cigital.com/papers/download/developer_gambling.php