Насколько случайным является System.Random в .NET 3?

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

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

Немного по теме, но это старая хорошая история, как все может пойти не так, если у вас нет хороших генераторов случайных чисел .. cigital.com/papers/download/developer_gambling.php

StefanE 06.01.2011 20:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
4 031
4

Ответы 4

В этом нет ничего плохого - он достаточно хорош для генерации простых паролей. Простой пример (источник):

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 для генерации паролей.

CodesInChaos 29.04.2012 02:06

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

@Glenn Slaven: это отличная статья, но она не о том, чтобы сделать Syste.Random более случайным! Речь идет о решении вызова конструктора Random с начальным значением времени, когда прошло очень мало времени (например, в жестком цикле).

Mitch Wheat 05.01.2009 02:07

Есть несколько компьютерных историй о программистах, которые думали, что могут сделать генератор случайных чисел «более случайным», сделав «кое-что» с результатом и полностью нарушив его псевдослучайность.

Mitch Wheat 05.01.2009 02:09

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

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

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

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

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

Другие вопросы по теме